一千萬個為什麽

搜索

使用FileStream類復制文件,為什麽輸出不匹配輸入?

為什麽下面的代碼不會為輸入文件生成相同的輸出文件?

想法是緩沖文件的一部分並從較小的緩沖區中寫出(這是一個小程序,在我正在傳輸文件的大項目中再現錯誤)。在十六進制編輯器比較工具中檢查這些文件時,輸出文件有所不同。

fsIn = new FileStream("c:\\wmvs\\Wildlife.wmv", FileMode.Open, FileAccess.Read);
        fsOut = new FileStream("c:\\Users\\public\\documents\\compare\\out.wmv",      FileMode.Create, FileAccess.Write);

        bData = new byte[fsIn.Length/10];
        bOut = new byte[524288];

        fsIn.Read(bData, 0, bData.Length);

        bool bGo = true;

        while (bGo)
        {
            if (nWrittenOut == bData.Length)
            {
                fsIn.Read(bData, 0, bData.Length);
            }

            if (nWrittenOut + bOut.Length >= bData.Length)
            {
                Array.Clear(bOut, 0, bOut.Length);

                int nWhatsLeft = bData.Length - nWrittenOut;
                Array.Copy(bData, nWrittenOut, bOut, 0, nWhatsLeft);

                fsIn.Read(bData, 0, bData.Length);
                nWrittenOut = 0;
                int nBufPos = nWhatsLeft;

                nWhatsLeft = bOut.Length - nWhatsLeft;
                Array.Copy(bData, nWrittenOut, bOut, nBufPos, nWhatsLeft);
                nWrittenOut += bOut.Length;

            }
            else
            {
                Array.Copy(bData, nWrittenOut, bOut, 0, bOut.Length);
                nWrittenOut += bOut.Length;
            }

            fsOut.Write(bOut, 0, bOut.Length);
            fsOut.Flush();

            if (fsOut.Position >= fsIn.Length)
                bGo = false;
        }

    }

我已經嘗試了以下所有答案,沒有任何作用。它必須是我在代碼中的邏輯。但是我看不出問題????似乎我在輸出文件中缺少一個與bOut長度相等的整塊。

最佳答案

我不知道你在做什麽,但為什麽不試試這個,通過FileStream讀取和寫入可能不是編碼不可知的,所以堅持使用流並只傳遞字節:

using (Stream inStream = File.Open(inFilePath, FileMode.Open))
{
    using (Stream outStream = File.Create(outFilePath))
    {
        while (inStream.Position < inStream.Length)
        {
            outStream.WriteByte((byte)inStream.ReadByte());
        }
    }
}

轉載註明原文: 使用FileStream類復制文件,為什麽輸出不匹配輸入?