[英]C# Trying to replace a byte while using MemoryStream class
我从大型机获取文本文件,有时在文本行的中间注入了一些0x0D。
previos程序员使用FileStream类创建了一个方法。 这种方法工作正常,但需要大约30分钟才能通过整个文件。
我的想法是将所需的文本行(大约25行)传递给方法以减少处理时间。
我一直在使用MemoryStream类,但遇到问题,它没有找到0x0D
控制代码。
这是当前的FileStream方法:
private void ReplaceFileStream(string strInputFile)
{
FileStream fileStream = new FileStream(strInputFile, FileMode.Open, FileAccess.ReadWrite);
byte filebyte;
while (fileStream.Position < fileStream.Length)
{
filebyte = (byte)fileStream.ReadByte();
if (filebyte == 0x0D)
{
filebyte = 0x20;
fileStream.Position = fileStream.Position - 1;
fileStream.WriteByte(filebyte);
}
}
fileStream.Close();
}
这是MemoryStream方法:
private void ReplaceMemoryStream(string strInputLine)
{
byte[] byteArray = Encoding.ASCII.GetBytes(strInputLine);
MemoryStream fileStream = new MemoryStream(byteArray);
byte filebyte;
while (fileStream.Position < fileStream.Length)
{
filebyte = (byte)fileStream.ReadByte();
if (filebyte == 0x0D)
{
filebyte = 0x20;
fileStream.Position = fileStream.Position - 1;
fileStream.WriteByte(filebyte);
}
}
fileStream.Close();
}
因为我之前没有使用过MemoryStream类,所以不熟悉它。 任何提示或想法?
我不知道你的文件的大小,但如果它们足够小,你可以一次加载整个内存,那么你可以做这样的事情:
private void ReplaceFileStream(string strInputFile)
{
byte[] fileBytes = File.ReadAllBytes(strInputFile);
bool modified = false;
for(int i=0; i < fileBytes.Length; ++i)
{
if (fileByte[i] == 0x0D)
{
fileBytes[i] = 0x20;
modified = true;
}
}
if (modified)
{
File.WriteAllBytes(strInputFile, fileBytes);
}
}
如果您无法立即读取整个文件,那么您应该切换到缓冲读取类型的设置,这是一个从文件读取,写入临时文件,然后最终复制临时文件的示例原始文件。 这应该会产生更好的性能,然后一次读取一个字节的文件:
private void ReplaceFileStream(string strInputFile)
{
string tempFile = Path.GetTempFileName();
try
{
using(FileStream input = new FileStream(strInputFile,
FileMode.Open, FileAccess.Read))
using(FileStream output = new FileStream(tempFile,
FileMode.Create, FileAccess.Write))
{
byte[] buffer = new byte[4096];
bytesRead = input.Read(buffer, 0, 4096);
while(bytesRead > 0)
{
for(int i=0; i < bytesRead; ++i)
{
if (buffer[i] == 0x0D)
{
buffer[i] = 0x20;
}
}
output.Write(buffer, 0, bytesRead);
bytesRead = input.Read(buffer, 0, 4096);
}
output.Flush();
}
File.Copy(tempFile, strInputFile);
}
finally
{
if (File.Exists(tempFile))
{
File.Delete(tempFile);
}
}
}
如果您的替换代码没有在流中找到0x0D
,并且使用FileStream的前一个方法执行此操作,我认为可能是因为您使用的编码来获取文件的字节,您可以尝试使用其他一些编码类型。
否则你的代码似乎很好,我会在MemoryStream周围使用它来确保它被关闭和处理,如下所示:
using(var fileStream = new MemoryStream(byteArray))
{
byte filebyte;
// your while loop...
}
查看您的代码我不是100%确定您对内存流所做的更改将被保留; 实际上我认为如果您在更改后没有保存它,您的更改将会丢失。 我可能在这方面是错的,但你应该测试并看看,如果不能保存,你应该使用StreamWriter在更改后保存它。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.