Могу ли я просто «прочитать» файл, который используется? - PullRequest
14 голосов
/ 15 октября 2008

Я пытаюсь использовать StreamReader для чтения файла, но он всегда используется другим процессом, поэтому я получаю эту ошибку:

Процесс не может получить доступ к файлу «\ Arfjwknasgmed17 \ C $ \ FLAG СОСТОЯНИЕ \ CP-ARFJN-FLAG.XLS ', потому что он используется другим процессом.

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

Ответы [ 2 ]

25 голосов
/ 15 октября 2008

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

Если файл действительно не имеет прав на чтение, вы не сможете скопировать его.

Возможно, вы не сможете получить доступ к файлу, если вы укажете право на совместное использование, которое противоречит праву на совместное использование программы, в которой уже открыт файл. Например, вы не можете предоставить доступ на запись, если программа, которая уже открыла его, не предоставляет доступ на запись.

Если программа, открывшая файл в первую очередь, поддерживает теневое копирование тома (VSS), вы также можете использовать VSS для получения доступа к файлу.

Существуют коммерческие программные драйверы, которые позволяют вам получать доступ к таким файлам, даже когда они используются. Раньше у вас была возможность получить Open File Manager от St-Bernards, и вы также можете использовать File Access Manager (FAM) от VisionWorks Solutions Inc. в своей продукции.

VSS работает, сообщая программе, у которой уже открыт файл, что другая программа хотела бы прочитать из файла. Затем VSS делает копию файла и позволяет вам читать из этой копии. VSS не работает для устаревших приложений.

FAM прозрачно работает как с устаревшими, так и с не унаследованными программами, указав «список разрешенных» приложений, которые могут обращаться только к открытым и заблокированным файлам. Только программы в этом списке имеют доступ к этим файлам. Когда файл открывается, он переходит в режим кэширования, поэтому вы получите копию файла, которая была при запуске «резервного копирования / открытия» файла. В этот момент программа, которая первоначально открыла файл, видит файл таким, какой он есть на самом деле, а вторая программа в списке разрешенных файлов видит файл таким, каким он был, когда произошло «открытие / резервное копирование» файла. Это обеспечивает согласованность файла.

2 голосов
/ 03 февраля 2012

попробуйте следующий код.

FileStream fileStr = File.Open(<full file name>, FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
fileStream = new StreamReader(fileStr);

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

Отказ от ответственности: это работает, но я не уверен, стоит ли использовать его в рабочем коде. Я пока не могу найти официальную документацию, которая говорит, что она должна работать.

...