Как проверить, записывается ли файл в настоящее время
У меня есть приложение, которое должно проверять папку и читать любые файлы, которые копируются в нее.
Как проверить, записывается ли файл в этой папке? Я хочу только читать файлы
которые имели все свои данные, написанные для них, и закрыты.
Ответы
Ответ 1
Это не чисто, но он работает:
try
{
using (Stream stream = new FileStream("File.txt"))
{
}
}
catch
{
// Check if file is in use (or whatever else went wrong), and do any user communication that you need to
}
Мне не нравится использовать исключения как условия, но насколько я знаю, это самый простой и лучший (и только надежный) способ сделать это.
Ответ 2
Возможно открытие файла исключительно так:
System.IO.File.Open(PathToFile, FileMode.Open, FileAccess.ReadWrite, FileShare.None);
Это может быть помещено в цикл с try/catch до его успешного завершения.
Ответ 3
Исключение сбоя дорого стоит, вы должны попробовать:
http://msdn.microsoft.com/en-us/library/system.io.filesystemwatcher.aspx
Там есть отличный пример на странице msdn. Это даст вам приятные события по изменению, созданию, удалению, переименованию.
скопируйте файл в папку и переименуйте, когда вы закончите, перехватите событие переименования и убедитесь, что вы еще не закончили чтение файлов.
Или вы могли бы перехватывать события изменений до тех пор, пока это (это сложно), они больше не увольняются.
Ответ 4
Единственное, о чем я могу думать, это то, что при записи на файл будет помещен файловый замок, поэтому вы не должны писать на него (бросая исключение System.IO из файла, заблокированного другим процессом), но это не является надежным. Например, файл можно записать в куски, открыв и закрыв файл для каждого фрагмента.
Итак, вы можете сделать это с помощью блока try/catch:
try
{
//opening the file
}
catch(IOException ex)
{
// file is open by another process
}
Ответ 5
Когда вы открываете его с помощью System.IO.File.OpenWrite(filename)
, он должен бросать IOException
.
Итак, в попытке catch код, выполняемый в блоке catch, должен сказать вам, что файл открыт.
Ответ 6
Файл, на который записано, обычно имеет блокировку записи, поэтому, если вы попытаетесь открыть его для записи, вы потерпите неудачу; но OTOH у вас может быть процесс, который открывает, записывает и закрывает файл, а затем повторяет.
Я думаю, что самым простым и безопасным способом было бы просто проверить файлы, которые были написаны в последнее время, но не TOO последние (например, не за последние 2 секунды или около того)
[le] Еще один момент, который следует учитывать, заключается в том, что если у вас есть процесс, который записывает данные в chunck (open-write-close), и вы получаете эксклюзивную блокировку для файла (чтобы проверить, что файл больше не используется) - чем ваш внешний процесс завершится неудачно. Я думаю, что гораздо лучше проверить отметки времени и получить эксклюзивную блокировку после того, как вы уверены, что другой процесс закончил писать.
Ответ 7
Количество опций. Тот, который сразу приходит в голову, должен попытаться открыть файл для записи. Если вы вызываете исключение, оно все еще записывается. Подождите определенный период и повторите попытку.
Альтернативно проверяйте отметки времени и только пробуйте прочитать файл через 1 или 2 минуты после последнего изменения временной отметки.
Ответ 8
Используйте System.IO.FileSystemWatcher
для определения файлов, которые были изменены.
Откройте их в эксклюзивный читатель (FileMode.Read
) в создании копий и поймайте исключение, если это не сработает (потому что кто-то еще он открыт для записи).
Ответ 9
Если у вас есть какой-либо контроль над процессом, в котором выполняется запись, тогда подумайте об увеличении его, чтобы произошел следующий процесс:
- Процесс начинает записывать файл "filename.xyz"
- Процесс записывает больше файла "filename.xyz"
- ....
- ....
- Процесс завершает запись файла "filename.xyz"
- Процесс записывает другой (нулевой, пустой) файл в папку с именем "filename.xyz.done"
Вы можете искать файлы ".done" в качестве триггера для начала обработки файла. Опять же, это будет работать, только если у вас есть способ изменить процесс, который записывает файлы.