Могу ли я просто "прочитать" используемый файл?
-
03-07-2019 - |
Вопрос
Я пытаюсь использовать StreamReader для чтения файла, но он всегда используется другим процессом, поэтому я получаю эту ошибку:
Процесс не может получить доступ к файлу '\arfjwknasgmed17\C$\ФЛАГ CONDITION\CP-ARFJN-FLAG.XLS - потому что он используется другим процессом.
Есть ли способ, которым я могу прочитать это, не копируя?Или это мой единственный вариант?
Решение
Вы можете прочитать файл, только если программа, открывшая файл, первой указала права общего доступа к этому файлу на чтение.
Однако, если у файла действительно нет прав на совместное использование для чтения, вы вообще не сможете его скопировать.
Возможно, вы не сможете получить доступ к файлу, если вы указываете право общего доступа, которое конфликтует с правом общего доступа программы, у которой уже открыт файл.Например, вы не можете предоставить доступ на запись, если программа, в которой он уже открыт, не предоставляет доступ на запись.
Если программа, которая открыла файл в первую очередь, поддерживает Volume Shadow Copy (VSS), вы также можете использовать VSS для получения доступа к файлу.
Существуют коммерческие драйверы программного обеспечения, которые позволяют вам получать доступ к таким файлам, даже когда они используются.Раньше у вас была возможность получить Open File Manager от St-Bernards, и вы также можете использовать Менеджер доступа к файлам (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.Если файл уже открыт в режиме записи каким-либо другим процессом и в нем не указаны права общего доступа, вы все равно сможете открыть файл в режиме чтения.
Отказ от ответственности:Это работает, но я не уверен, стоит ли вам использовать это в производственном коде.Я пока не могу найти никакой официальной документации, в которой говорилось бы, что это должно сработать.