2008-11-10 2 views
0

Если я читаю текстовый файл в режиме общего доступа, а другой процесс обрезает его, то какой самый простой способ обнаружить это? (Я исключаю очевидный выбор обновления объекта FileInfo периодически, чтобы проверить его размер). Есть ли удобный способ захвата события? (Filewatcher?)Как обнаружить усеченный файл в C#

ответ

3

Существует Это называется FileSystemWatcher.

Если вы разрабатываете приложение для форм Windows, вы можете перетащить его из панели инструментов.

Вот несколько примеров использования:

private void myForm_Load(object sender, EventArgs e) 
{ 
    var fileWatcher = new System.IO.FileSystemWatcher(); 

    // Monitor changes to PNG files in C:\temp and subdirectories 
    fileWatcher.Path = @"C:\temp"; 
    fileWatcher.IncludeSubdirectories = true; 
    fileWatcher.Filter = @"*.png"; 

    // Attach event handlers to handle each file system events 
    fileWatcher.Changed += fileChanged; 
    fileWatcher.Created += fileCreated; 
    fileWatcher.Renamed += fileRenamed; 

    // Start monitoring! 
    fileWatcher.EnableRaisingEvents = true; 
} 

void fileRenamed(object sender, System.IO.FileSystemEventArgs e) 
{ 
    // a file has been renamed! 
} 

void fileCreated(object sender, System.IO.FileSystemEventArgs e) 
{ 
    // a file has been created! 
} 

void fileChanged(object sender, System.IO.FileSystemEventArgs e) 
{ 
    // a file is modified! 
} 

Это в System.IO и System.dll, так что вы должны быть в состоянии использовать его в большинстве типов проектов.

+0

Не знал этого. +1 – 2008-11-10 19:12:23

+0

Как я полагаю, я подумал об этом, но мне было любопытно, есть ли другие решения. Я все равно голосую за ваш ответ, потому что вы дали такой хороший образец кода! ;-) – dviljoen 2008-11-10 19:23:29

+0

Ну .. вы просили «удобного» способа ... Я не думаю, что есть что-то более удобное ... кроме того, что вы можете перепроектировать свой подход к проблеме, как показано ниже в статье @petercrabtree. И спасибо за +1, я приближаюсь к тому, чтобы получить еще одну способность к SO :-) – chakrit 2008-11-10 19:29:28

0

Просто что-то пережевывать; он может не относиться к вашей ситуации:

Решение chakrit подходит именно вам, но я должен спросить: почему вы читаете файл, а другой процесс усекает его?

В частности, если у вас нет синхронизации, чтение/запись файлов одновременно небезопасно, и вы обнаружите, что у вас есть другие загадочные проблемы.

3

FSW не может работать надежно, он асинхронный. Предполагая, что вы не получите исключения, StreamReader.ReadLine() вернет null, когда файл будет усечен. Затем проверьте, изменился ли размер. Остерегайтесь неизбежного состояния гонки, вам нужно будет проверить предположения о сроках.

Смежные вопросы