1

タイトルはそれをすべて本当に言います。

private bool addToBinary(byte[] msg, string filepath)
{
    bool succ = false;

    do
    {
        try
        {
            using (Stream fileStream = new FileStream(filepath, FileMode.Append, FileAccess.Write, FileShare.None))
            {
                using (BinaryWriter bw = new BinaryWriter(fileStream))
                {
                    bw.Write(msg);

                    bw.Flush();
                    fileStream.Flush();
                    bw.Close();
                }
            }
            succ = true;
        }
        catch (IOException ex) { Console.WriteLine("Write Exception (addToBinary) : " + ex.Message); }
        catch (Exception ex) { Console.WriteLine("Some Exception occured (addToBinary) : " + ex.Message); return false; }
    } while (!succ);
    return true;
}

(bw.closeは、基になるストリームも閉じます)

これを任意のループで使用すると、次のような出力が発生します。

A first chance exception of type 'System.IO.IOException' occurred in mscorlib.dll
Write Exception (addToBinary) : The process cannot access the file 'C:\test\test.png' because it is being used by another process.

ファイルが大きくなるほど、これらのエラーが多く表示されます。最終的には成功しますが、ファイルの書き込み速度が大幅に低下します。Stream fileStream =例外を引き起こすのはビットです。

私は何を間違えましたか?

使用例;

do
{
    serverStream = clientSocket.GetStream();
    bytesRead = serverStream.Read(inStream, 0, buffSize); //How many bytes did we just read from the stream?

    recstrbytes = new byte[bytesRead]; //Final byte array
    Array.Copy(inStream, recstrbytes, bytesRead); //Copy from inStream to the final byte array
    addToBinary(recstrbytes, @"C:\test\test.png"); //Append final byte array to binary
    received += recstrbytes.Length; //Increment bytes received
}while (received < filesize);
4

2 に答える 2

1

ステートメントを使用して積み重ねられた人のためのスタイルに関する良いアドバイス。複数のスタイルを使い始めるときは、多くの場合、次のスタイルを使用する方が適切です。

using (Stream fileStream = new FileStream(filepath, FileMode.Append, FileAccess.Write, FileShare.None))
using (BinaryWriter bw = new BinaryWriter(fileStream))
{
    bw.Write(msg);
    bw.Flush();
    fileStream.Flush();
    bw.Close();
}

申し訳ありませんが、あなたの質問を解決することはできませんが、最初のラウンドで成功しなかった場合、ストリームへの書き込みを繰り返し試行することがどれほど良い考えかはわかりません.

于 2012-06-28T15:59:14.623 に答える
1

Stream を使用してファイルを読み取る前に、まずファイルにアクセスできるかどうかを確認する必要があります。

このリンクを見ることができます:

ファイルを開くときのエラーを処理する最良の方法

私は自分の答えを投稿しましたが、答えを見てください

https://stackoverflow.com/a/9503939/448407 ただし、回答としてマークされた投稿を見ることができます。

ファイルにアクセスできる場合にのみファイルの内容を読んでください。そうすればうまくいくと思います。

于 2012-06-28T15:52:14.440 に答える