Могу ли я просто «прочитать» используемый файл?

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

Процесс не может получить доступ к файлу '\ arfjwknasgmed17 \ C $ \ FLAG CONDITION \ CP-ARFJN-FLAG.XLS', потому что он используется другим процессом.

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


person naspinski    schedule 15.10.2008    source источник


Ответы (2)


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

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

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

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

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

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

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

person Brian R. Bondy    schedule 15.10.2008

попробуйте приведенный ниже код.

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

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

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

person JST    schedule 03.02.2012