[英]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.