簡體   English   中英

C#嘗試在使用MemoryStream類時替換一個字節

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM