C#FileWatcher文件读取后不可用

时间:2014-07-29 08:19:40

标签: c# file-io

我刚刚开始使用C#,我尝试创建一个FileWatcher,它应该打印文件的内容,如果它被更改:

{
    public static void watch()
    {
      FileSystemWatcher watcher = new FileSystemWatcher();
      watcher.Path = "Path";
      watcher.NotifyFilter = NotifyFilters.LastWrite;
      watcher.Filter = "Filter";
      watcher.Changed += new FileSystemEventHandler(OnChanged);
      watcher.EnableRaisingEvents = true;
    }
    public static void OnChanged(object source, FileSystemEventArgs e)
    {
        using (TextReader r = File.OpenText("Path")) {
         while ((s = r.ReadLine()) != null) {
              Console.WriteLine(s);
         }
         r.Close();
      }
    }
    static void Main()
    {
        watch();
    }
}

到目前为止,FileWatcher工作正常,但如果我尝试打印内容,它会工作一次,无论我等多久,程序都会停止第二次更改。 据我所知,“using”语句应该释放文件。 close命令根本不会改变任何东西。

该文件是一个非常小的文本文件,应该不是问题。

是否有强制程序释放文件?

4 个答案:

答案 0 :(得分:1)

我认为代替watcher.EnableRaisingEvents = true,在您的情况下想要使用watcher.WaitForChanged(WatcherChangeTypes.All),让您的程序无限期地等待更改。

顺便说一句,语句r.Close()是多余的,因为您已经通过Dispose()隐式调用了usingClose()会调用WaitForChanged

编辑:更具体一点:while(true) { watcher.WaitForChanged(WaitForChanged.All); // Do stuff with the changed file here, no event handler needed using(var sr = new StreamReader(filePath)) { // ... } } 当然只等待一次更改然后返回,所以如果你想等待更多的更改,你可以使用一个循环。请注意,如果以这种方式使用它,则不需要事件处理程序。

{{1}}

答案 1 :(得分:0)

要做的第一件事是调试并验证方法OnChanged是仅被调用一次还是在被监视文件的以下编辑中,然后您已经知道问题是否与生命周期/范围相关观察者或其他地方。

这是一个控制台应用程序吗?在主调用watch方法后它会关闭还是保持打开状态?

答案 2 :(得分:0)

以下代码可以正常使用:

using System;
using System.IO;

namespace FileReadTest
{
    internal class Program
    {
        public static FileSystemWatcher watch()
        {
            FileSystemWatcher watcher = new FileSystemWatcher();
            watcher.Path = "d:\\";
            watcher.NotifyFilter = NotifyFilters.LastWrite;
            watcher.Filter = "test.txt";
            watcher.Changed += new FileSystemEventHandler(OnChanged);
            watcher.EnableRaisingEvents = true;
            return watcher;

        }
        public static void OnChanged(object source, FileSystemEventArgs e)
        {
            string s;

            using (StreamReader r = new StreamReader(File.Open("d:\\test.txt", FileMode.Open, FileAccess.Read, FileShare.ReadWrite)))
            {
                while ((s = r.ReadLine()) != null)
                {
                    Console.WriteLine(s);
                }
            }
        }

        static void Main()
        {
            var watcher = watch();
            Console.ReadKey();
            watcher.Dispose();
        }
    }
}

请注意,我已经更改了文件读取例程,以避免在其他程序打开文件时出现一些读取问题。 FileSystemWatcher也不会超出范围,也不会被意外处理。

答案 3 :(得分:-4)

您需要处理FileSystemWatcher。

public static void OnChanged(object source, FileSystemEventArgs e)
    {
        using (TextReader r = File.OpenText("Path")) {
         while ((s = r.ReadLine()) != null) {
              Console.WriteLine(s);
         }
         r.Close();
      }
      File((FileSystemWatcher)sender).Dispose();
    }