я могу сделать несколько объектов FileStream в один файл одновременно? - PullRequest
0 голосов
/ 04 ноября 2019

почему в объекте fs2 выдается ошибка ?? я уже написал FileShare.ReadWrite в объекте fs

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

Может кто-нибудь сказать мне, почему эта ошибка?

error = Процесс не может получить доступ к файлу 'C: \ Users \ iP\ documents \ visual studio 2015 \ Projects \ ConsoleApplication32 \ ConsoleApplication32 \ bin \ Debug \ hello.txt ', так как он используется другим процессом.

Ответы [ 2 ]

0 голосов
/ 04 ноября 2019

Вы получаете эту ошибку, потому что вы передаете FileShare.None во второй вызов. Если вы измените его на FileShare.ReadWrite, чтобы соответствовать первому вызову, у вас не будет этой проблемы.

Причина этого в том, что конструктор FileStream вызывает CreateFileW внизуи если вы посмотрите на документацию по этой функции, то в ней говорится:

Вы не можете запросить режим совместного использования, который конфликтует с режимом доступа, который указан в существующем запросе с открытым дескриптором, CreateFile завершится с ошибкой, и функция GetLastError вернет ERROR_SHARING_VIOLATION .

У вас уже есть открытый дескриптор из первого запроса с использованием FileAccess.ReadWrite в качестве режима доступа, который конфликтует с FileShare.None во втором вызове.

0 голосов
/ 04 ноября 2019

Поскольку ваш код никогда не закрывает файл и имеет открытый дескриптор к нему

Если вы можете всегда использовать оператор using, он будет flush и closeфайл

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

Если 2 метода работают с одним файлом, передайте FileStream в

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