Я хотел бы открыть тот же файл для чтения и записи. Указатель файла должен быть независимым. Поэтому операция чтения не должна перемещать позицию записи и наоборот.
В настоящее время я использую этот код:
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.Open
мы пытаемся запретить доступ к другим приложениям, указав FileShare.Read
. Вместо этого мы должны разрешить первому потоку записывать в файл:
FileStream fileRead = File.Open (path, FileMode.OpenOrCreate, FileAccess.Read, FileShare.ReadWrite);
Это неотъемлемо правильно, так как поток чтения не должен заботиться о том, чтобы другие люди писали файл. По крайней мере, я больше не получаю исключения.
У меня нет С# под рукой, поэтому я не могу его протестировать.
Не можете ли вы использовать FileAccess.ReadWrite вместо FileAccess.Read?
Изменить: ответ - нет. Для этого вам нужно использовать FileShare.
FileShare
контролирует, как доступ используется совместно с другими объектамиFileStream
(фактически, с дескрипторами файлов), а не с другими потоками или процессами. Из msdn.microsoft.com/en-us/library/system.io.fileshare.aspx : «управление видом доступа, который другие объекты FileStream могут иметь к одному и тому же файлу». Документация вFile.Open
рассказывает о потоках. Это не правильно.