Чтение файла без возникновения IOException в сторонней программе

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

using (FileStream fs = new FileStream(
                         FullPath,
                         FileMode.Open,
                         FileAccess.Read,
                         FileShare.ReadWrite))

Однако сторонняя программа записывает в файл, но использует FileShare.None

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

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


person CathalMF    schedule 05.08.2013    source источник
comment
Вы пытались скопировать его во временное место и прочитать оттуда? Обычно я создаю функцию, которая пытается прочитать файл, если он используется, она возвращает false, но если не возвращает true, я пытаюсь скопировать и переместить файл в место, где я могу с ним работать. Работа с производственным файлом может быть потенциально опасной, особенно при одновременном использовании двух процессов.   -  person Bearcat9425    schedule 05.08.2013
comment
File.Copy просто выполняет FileStream в фоновом режиме. Проблема не в том, когда я пытаюсь читать, а он заблокирован. Это когда у меня есть доступ к файлу, а сторонняя программа пытается получить эксклюзивный доступ, но не может, потому что он у меня открыт.   -  person CathalMF    schedule 05.08.2013
comment
Что, если вы скопируете файл во временное место и позволите своей программе использовать этот временный файл, чтобы исходный файл не использовался, и, следовательно, сторонняя программа могла без проблем получить к нему доступ. Если это имеет смысл :D   -  person aladd04    schedule 05.08.2013
comment
Функция копирования просто открывает файл, читает его и записывает в новое место. По сути вызывает ту же проблему.   -  person CathalMF    schedule 05.08.2013
comment
Да, я имею в виду, что операция копирования будет быстрее, чем операция чтения и обработки, похоже, что с точки зрения логистики у вас всегда будет потенциал наступить на пальцы других процессов, по крайней мере, если вы просто копируете свои входы и выходы быстрее и уменьшаете этот риск. Я бы сделал так, чтобы наблюдатель файловой системы следил за этим файлом на предмет модификаций, что означает, что третья сторона только что обновила его, а затем попыталась прочитать, что не удастся, пока третья сторона не выпустит его, а затем скопирует и выйдет и поработает с временным файлом.   -  person Bearcat9425    schedule 05.08.2013
comment
Да, вы правы, это поможет снизить риск этого, но это все равно произойдет. Я уже зацикливаюсь, пока не получу доступ, но проблема та же. Когда у меня есть доступ, другое приложение пытается записать снова и терпит неудачу.   -  person CathalMF    schedule 05.08.2013
comment
Ну, я не уверен, что вы сможете устранить эту проблему, учитывая способ записи в файл. Если вы не можете устранить проблему, лучше всего попытаться максимально уменьшить вероятность ее возникновения.   -  person Bearcat9425    schedule 05.08.2013
comment
Медвежонок прав. Если сторонняя программа запрашивает эксклюзивный доступ через FileShare.None, вы ничего не можете с этим поделать (я знаю). Вам просто нужно найти обходной путь, чтобы максимально снизить вероятность возникновения ошибок и обрабатывать возникающие ошибки наилучшим образом для вашей ситуации. РЕДАКТИРОВАТЬ: Предполагая, что вы не можете приостановить стороннее приложение, чтобы оно просто догоняло чтение/запись после того, как вы сделаете то, что вам нужно сделать со своим.   -  person aladd04    schedule 05.08.2013
comment
Исправьте все это, если предположить, что нет способа программно приостановить стороннюю обработку для выполнения вашей обработки. Еще одна вещь, о которой я могу думать, - это предсказуемый график его записи и его отлова в это время. Еще одна мысль, которая у меня была, заключалась в том, чтобы поместить наблюдатель за файлом в этот файл и дождаться измененного времени, которое скажет вам, что третья сторона только что написала в запись, и вероятность того, что она сразу же сделает еще одну запись, низка, поэтому, как только это будет сделано, сделайте свою копию и работать с временным файлом. FileSystemWatcher не блокирует файл.   -  person Bearcat9425    schedule 05.08.2013


Ответы (3)


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

IWbemServices::ExecNotificationQuery

Вот некоторые дополнительные сведения о MSDN. Вот также CodeProject: Информация об обработке и уведомления с использованием WMI< /а>

person josh poley    schedule 17.08.2013
comment
К сожалению, другой процесс является службой, поэтому он всегда работает. - person CathalMF; 23.08.2013

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

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

person Felipe Pereira    schedule 17.08.2013
comment
Возможно, у этого сервиса есть какой-то общедоступный метод, откуда вы можете получить ту же информацию, что и в файле. - person Felipe Pereira; 24.08.2013

Пока я не использовал его, вы пытались использовать файл System.IO.Filestream.Unlock, чтобы помочь вам передавать части файла, которые в настоящее время не заблокированы другим программным обеспечением? Я просто предполагаю, что другое программное обеспечение не блокирует весь файл.

person Jamie Clayton    schedule 04.01.2014