none
Мониторинг занятости файла. RRS feed

  • Вопрос

  • Подскажите пожалуйста, как можно в C# осуществить мониторинг занятости файла другим приложением? Т.е. я имею приложение, которое следит за файлами в папке с помощью FileSystemWatcher. Другое приложение в это время производит запись в файл, сохраняет изменения, но файл не отпускает, а моё пытается открыть ещё не закрытый файл, из-за этого происходит исключение IOException  (файл используется другим процессом).
    • Перемещено Tagore Bandlamudi 2 октября 2010 г. 22:13 MSDN Forums consolidation (От:Разработка Windows-приложений)
    15 ноября 2009 г. 9:56

Ответы

  • По идее событие Changed у FileSystemWatcher возникает, когда другой процесс освобождает ресурсы, связанные с файлом, т.е. пусть имеется такой код который постоянно записывает строку в файл
        class Program
        {
            static void Main(string[] args)
            {
                FileStream fs = new FileStream("c:\\test.txt", FileMode.OpenOrCreate, FileAccess.ReadWrite);
                StreamWriter sw = new StreamWriter(fs);
                while (Console.ReadLine() != "q")
                {
                    sw.WriteLine("Test");
                }
                sw.Close();
            }
        }
    и второй процесс, который следит за изменениями в файле с помощью FileSystemWatcher
            private void fileSystemWatcher1_Changed(object sender, System.IO.FileSystemEventArgs e)
            {
                textBox1.Text += "changed\n";
            }
    Так вот сколько бы я строк не вводил с помощью первого процесса, возникнет всего одно событие Changed после закрытия потоко StreamWriter и оно будет обработано во втором процессе. Таким образом вам нужно закрывать все ресурсы, связанные с файлом для того, чтобы проследить изменения.
    Ну а если вы хотите использовать одновременную запись в файл несколькими процессами, то открывайте файл с соответсвующими правами FileShare для записи\чтения
    FileStream fs = new FileStream("c:\\test.txt", FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.ReadWrite );
    • Предложено в качестве ответа I.Vorontsov 16 ноября 2009 г. 10:47
    • Помечено в качестве ответа I.Vorontsov 23 ноября 2009 г. 8:14
    16 ноября 2009 г. 8:49