Поток файлов с заблокированным файлом

#c# #.net #c#-4.0 #filestream #filelock

#c# #.net #c #-4.0 #поток файлов #блокировка файла

Вопрос:

Мне интересно, возможно ли получить файловый поток только для чтения в заблокированный файл? Теперь я получаю исключение при попытке прочитать заблокированный файл.

 using (FileStream stream = new FileStream("path", FileMode.Open))
  

Спасибо!

Комментарии:

1. Строка, которую вы показываете, не пытается прочитать заблокированный файл, в ней вы пытаетесь открыть файл. Вы создаете этот файл где-то еще? Если условие блокировки существует, вы, вероятно, делаете что-то для создания этого условия. Пожалуйста, покажите больше кода вокруг единственной строки, которую вы указали.

Ответ №1:

Вам следует попробовать другой конструктор. Они задокументированы в MSDN.

Это выглядит как ставка:

 FileStream Constructor (String, FileMode, FileAccess, FileShare)
  

Ссылка на MSDN

Доступ к файлу

Константа, которая определяет, как объект FileStream может получить доступ к файлу. Это возвращает свойства CanRead и CanWrite объекта FileStream. Значение CanSeek равно true, если путь указывает файл на диске.

Файлообменник

Константа, которая определяет, как файл будет совместно использоваться процессами.

Ответ №2:

 using (FileStream stream = new FileStream("path", FileMode.Open))
  

При этом будет использоваться значение по умолчанию для аргумента FileShare, FileShare.Read. Который запрещает любому процессу запись в файл. Это не может сработать, если в файл записывается другой процесс, вы не можете отказать в праве, которое уже было получено.

Вы должны указать файловый ресурс.ReadWrite. Это все еще могло бы не сработать, если бы другой процесс использовал FileShare.Нет, для этого нет обходного пути. Имейте в виду, что получение доступа на чтение к записываемому файлу сопряжено с трудностями, у вас нет надежного указания конца файла. Возможно, последняя запись или строка в файле были записаны только частично.

Ответ №3:

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

 FileStream fs = new FileStream(path, FileMode.Open, FileAccess.Read,FileShare.ReadWrite);
  

Ответ №4:

Вы можете просто разблокировать файл и прочитать файл после него. Просто используйте Handle.exe из Sysinternals или Unlocker с параметрами командной строки. Они оба могут разблокировать файл, и вы можете легко выполнить их из своей программы, не выходя из своей программы. (Но не используйте их для файла Windows SAM, это не работает с SAM 😉 ) Удачи !