Подтвердить что ты не робот

System.IO.FileStream FileAccess vs FileShare

Я искал все, но не могу найти ответ на этот вопрос. Я понимаю, что FileAccess имеет дело с доступом к файлу на машине и FileShare имеет дело с долей, но я не могу найти объяснение того, как именно это происходит вместе и как они влияют друг на друга.

Например, если у меня есть

using ( FileStream fs = new FileStream( pathName, FileMode.Open, FileAccess.Read, FileShare.ReadWrite) )

означает ли это, что пользователи на машине могут читать только файл, в то время как пользователи, удаленные для доступа к папке, могут читать и записывать в файл? Кроме того, что будет влиять на использование

using ( FileStream fs = new FileStream( pathName, FileMode.Open, FileAccess.Read ) )

Где я не указал FileShare?

4b9b3361

Ответ 1

FileAccess сообщает, что вы собираетесь делать с файлом. Довольно легко понять, вы узнаете, что собираетесь читать или писать.

FileShare намного сложнее, так как он требует, чтобы вы вступили в игру другого программиста. Он определяет, что может сделать другой процесс, если он также открыл файл. Два процесса доступа к файлу могут быть очень неприятными, вам нужно будет рассуждать о возможных возможных режимах отказа. Выбранное вами значение сильно коррелирует с типом файла и желаемым доступом. Разрушая это тем, что вы собираетесь делать:

FileAccess.Read

В целом очень мало проблем, если другой процесс также читается из файла. Таким образом, FileShare.Read является выбором по умолчанию.

Вам может понадобиться FileShare.ReadWrite, если другой процесс уже открыл файл для записи. Он уже получил доступ к записи, так что вы никогда не сможете открыть файл самостоятельно с помощью только FileShare.Read, вы не можете отрицать запись, поскольку этот другой процесс был первым, вместо этого вам будет отказано в доступе. Это обычно подходит для текстового файла, такого, где вы можете быть уверены, что другой процесс только добавляет текст в конец файла. Файл журнала является очень распространенным сценарием. Все еще довольно сложно, вы можете заметить частично написанные строки текста, остерегайтесь этого.

FileAccess.Write

Вы не можете использовать FileShare.Write или FileShare.ReadWrite. Поскольку это позволит одновременно обрабатывать два файла в файле, содержимое файла будет беспорядочным выходом из обеих программ. Небольшой краевой случай - это то, что процессы обрабатывают доступ к файлу между собой, обычно реализуемый с помощью именованного мьютекса.

Вы можете использовать FileShare.Read, если это текстовый файл, тот же сценарий, который я описал выше, с файлом журнала. Выбор по умолчанию в противном случае должен быть FileShare.None

FileAcces.ReadWrite

Не тот общий, используется только при записи двоичных данных и использовании Seek(). Нет никакой надежды на то, что любой другой процесс может когда-либо прочитать файл правильно, если вы это делаете, полагая, что они не разрешают доступ к себе, вы должны использовать FileShare.None.

Ответ 2

FileShare не имеет ничего общего с дисками, разделяемыми по сети, - это показывает, как другие процессы могут обращаться к файлу.

Если первый процесс открывает файл с FileShare.Read, другие процессы могут открыть файл с помощью FileAccess.Read, но в этом случае другой процесс не сможет открыть файл с FileAccess.Write.

Ответ 3

FileShare не имеет ничего общего с файлами Windows. В нем говорится о совместном использовании файлов только на одной машине. Он определяет, какие другие файлы обрабатываются после того, как вы максимально сможете это сделать. Кроме того, существующие ручки сравниваются с ним, чтобы решить, можете ли вы открыть файл или нет.

FileAccess указывает ваши права доступа.