我可以同时使多个FileStream对象成为一个文件吗?

时间:2019-11-04 05:04:28

标签: c# filestream

为什么在fs2对象中抛出错误?我已经在fs对象

中编写了FileShare.ReadWrite
     FileStream fs = new FileStream("hello.txt",FileMode.OpenOrCreate,FileAccess.ReadWrite,FileShare.ReadWrite);

        mama();

        Console.ReadKey();

    }
    static void mama()
    {
        FileStream fs2 = new FileStream("hello.txt", FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.None);
        fs2.Read(new byte[3], 0, 3);
    }

谁能告诉我为什么会出现这个错误?

错误=该进程无法访问文件'C:\ Users \ iP \ documents \ visual studio 2015 \ Projects \ ConsoleApplication32 \ ConsoleApplication32 \ bin \ Debug \ hello.txt',因为该文件正在被另一个进程使用。

2 个答案:

答案 0 :(得分:0)

因为您的代码永远不会关闭该文件并对其具有打开的句柄

如果可以,请始终使用using语句,它将flushclose文件

using(var fs = new FileStream(...))
{
    // do stuff here
} // this is where the file gets flushed and closed

如果两个方法在同一个文件上运行,请在{p> 1中传递

FileStream

答案 1 :(得分:0)

由于将FileShare.None传递给第二个呼叫,您遇到了该错误。如果将其更改为FileShare.ReadWrite以匹配第一个电话,则不会有问题。

其原因是因为FileStream构造函数在下面调用了CreateFileW,如果您查看该函数的文档,它会指出:

  

您不能请求与访问模式冲突的共享模式   在具有打开句柄的现有请求中指定的代码。    CreateFile 将失败,并且GetLastError函数将返回    ERROR_SHARING_VIOLATION

使用FileAccess.ReadWrite作为访问方式,第一个请求已经具有打开句柄,与第二个调用中的FileShare.None冲突。