Как открыть файл для самостоятельного чтения / записи?

2

Я хотел бы открыть тот же файл для чтения и записи. Указатель файла должен быть независимым. Поэтому операция чтения не должна перемещать позицию записи и наоборот.

В настоящее время я использую этот код:

FileStream fileWrite = File.Open (path, FileMode.OpenOrCreate, FileAccess.Write, FileShare.Read);
FileStream fileRead = File.Open (path, FileMode.OpenOrCreate, FileAccess.Read, FileShare.Read);
StreamWriter _Writer = new StreamWriter (fileWrite, new ASCIIEncoding ());
StreamReader _Reader = new StreamReader (fileRead, new ASCIIEncoding ());

Но это приводит к исключению IOException: "Процесс не может получить доступ к файлу, потому что он используется другим процессом"

Теги:
file-io

2 ответа

4
Лучший ответ

Думаю, я сам это понял. Во втором File.Open мы пытаемся запретить доступ к другим приложениям, указав FileShare.Read. Вместо этого мы должны разрешить первому потоку записывать в файл:

FileStream fileRead = File.Open (path, FileMode.OpenOrCreate, FileAccess.Read, FileShare.ReadWrite);

Это неотъемлемо правильно, так как поток чтения не должен заботиться о том, чтобы другие люди писали файл. По крайней мере, я больше не получаю исключения.

  • 0
    FileShare контролирует, как доступ используется совместно с другими объектами FileStream (фактически, с дескрипторами файлов), а не с другими потоками или процессами. Из msdn.microsoft.com/en-us/library/system.io.fileshare.aspx : «управление видом доступа, который другие объекты FileStream могут иметь к одному и тому же файлу». Документация в File.Open рассказывает о потоках. Это не правильно.
1

У меня нет С# под рукой, поэтому я не могу его протестировать.

Не можете ли вы использовать FileAccess.ReadWrite вместо FileAccess.Read?

Изменить: ответ - нет. Для этого вам нужно использовать FileShare.

  • 0
    Где именно? Для чтения или записи потока?
  • 0
    Я думаю, что это не сильно поможет, поскольку для этого потребуется еще больше прав на файл, чем для кода в OP. Возможно, вы имели в виду FileShare ? Вот что сработало для меня, как видно из моего ответа.
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню