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

问题描述 投票:0回答:1

为什么在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',因为该文件正在被另一个进程使用。

c# filestream
1个回答
0
投票

因为您的代码从不关闭文件,并且具有打开的句柄

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

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

[如果两个方法在同一个文件上运行,则将FileStream传入

static void mama(FileStream fs )
{
    fs .Read(new byte[3], 0, 3);
}

0
投票

您收到此错误,因为您正在将FileShare.None传递给第二个呼叫。如果您将其更改为FileShare.ReadWrite以匹配第一个电话,则不会有此问题。

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

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

您已经从使用CreateFileW的第一个请求获得了打开的句柄,该句柄与FileAccess.ReadWrite冲突。

© www.soinside.com 2019 - 2024. All rights reserved.