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

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

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

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

2 ответа

Решение

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

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

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

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

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

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

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

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

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

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

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

Другие вопросы по тегам