gpt4 book ai didi

C# 在使用 MemoryStream 类时尝试替换字节

转载 作者:行者123 更新时间:2023-11-30 15:06:44 25 4
gpt4 key购买 nike

我从大型机获取一个文本文件,有时在文本行的中间插入一些 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);
}
}
}

关于C# 在使用 MemoryStream 类时尝试替换字节,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7364002/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com