C# BinaryWriter在循环中的原因”;文件正在被另一个进程使用;即使已关闭且';使用';

C# BinaryWriter在循环中的原因”;文件正在被另一个进程使用;即使已关闭且';使用';,c#,C#,标题说的都是真的 private bool addToBinary(byte[] msg, string filepath) { bool succ = false; do { try { using (Stream fileStream = new FileStream(filepath, FileMode.Append, FileAccess.Write, FileShare.None))

标题说的都是真的

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.
文件越大,出现的错误就越多。它最终还是通过了,但它显著降低了文件写入速度。导致异常的是
流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);
do
{
serverStream=clientSocket.GetStream();
bytesRead=serverStream.Read(inStream,0,buffSize);//我们刚才从流中读取了多少字节?
recstrbytes=新字节[bytesRead];//最终字节数组
Copy(inStream,recstrbytes,bytesRead);//从inStream复制到最终字节数组
addToBinary(recstrbytes,@“C:\test\test.png”);//将最终字节数组附加到二进制
received+=recstrbytes.Length;//接收的增量字节
}while(接收<文件大小);

在使用Stream读取文件之前,您需要先检查是否可以访问该文件

您可以查看此链接:

看看答案 虽然我张贴了我的答案

但是你可以看看标有答案的帖子


只有在您可以访问文件时才阅读文件内容,我认为它会起作用。

对于那些使用语句的人,有一些很好的建议。当您开始使用多个样式时,使用以下样式通常更整洁:

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();
}

恐怕我无法解决您的问题,但我不确定如果第一次不成功,重复尝试写入流有多好。

在这里使用
BinaryWriter
是错误的,也没有必要使用它。@leppie删除二进制编写器并执行
fileStream.write(msg,0,msg.Length);fileStream.Flush();fileStream.Close()
也有同样的问题。看来我需要在将数据写入磁盘之前将其缓冲在内存中,以防止防防病毒一直扫描数据。我希望有一个替代方案,但我会就此提出另一个问题,因为它与此无关。@natli这是一个有趣的问题。
但我不确定有多少好的问题dea如果第一轮没有成功,就要反复尝试并写入流。
这根本不是一个好主意,但我遇到了这个问题,所以我还没有编写正确的错误处理;)