Могу ли я просто "прочитать" файл, который используется?

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

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

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

Ответы

Ответ 1

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

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

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

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

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

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

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

Ответ 2

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

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

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

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