C# 何时/何地实施FileSystemWatcher

C# 何时/何地实施FileSystemWatcher,c#,filesystemwatcher,C#,Filesystemwatcher,我现在有一个代码(程序)正在运行,它使用select输入文件、outputfolders,然后转换为xml 所有变量和方法都在一个类中(另一个文件,但这没有问题) 无论如何。我想将其行为更改为热文件夹行为;这样,当一些文件被添加到文件夹中时,它将基于已经实现的方法进行处理,并执行我想要的任何操作 好的,现在我的问题来了:实际上,在Form1.cs上,我得到的只是一些点击按钮的呼叫。 我应该将FileSystemWatcher+OnChanged方法放在Form1.Cs中还是放在Classes.C

我现在有一个代码(程序)正在运行,它使用select输入文件、outputfolders,然后转换为xml

所有变量和方法都在一个类中(另一个文件,但这没有问题)

无论如何。我想将其行为更改为热文件夹行为;这样,当一些文件被添加到文件夹中时,它将基于已经实现的方法进行处理,并执行我想要的任何操作

好的,现在我的问题来了:实际上,在Form1.cs上,我得到的只是一些点击按钮的呼叫。 我应该将FileSystemWatcher+OnChanged方法放在Form1.Cs中还是放在Classes.Cs文件中(这是包含所有方法、变量等的文件—业务逻辑)。 还有,我什么时候叫它?一旦form1被初始化,最好是什么?
谢谢你的意见:)

当然,不要把观察者放在你的表格里

可以使用的模式如下所示:

public class DirectoryRefresher : IDisposable
{
    private FileSystemWatcher FileWatcher { get; set; }

    public DirectoryRefresher(string directorypath)
    {
        FileWatcher = SetupFileWatcher(directoryPath);
    }

    protected FileSystemWatcher SetupFileWatcher(string path)
    {
        var watcher = new FileSystemWatcher(path);

        watcher.Changed += (sender, e) => { DoYourProcessing(e.FullPath); };
        watcher.Created += (sender, e) => { DoYourProcessing(e.FullPath); };
        watcher.Deleted += (sender, e) => { DoYourProcessing(e.FullPath); };

        watcher.EnableRaisingEvents = true;

        return watcher;
    }

    public void DoYourProcessing(string filePath)
    {
        ...
    }

    public void Dispose()
    {
        try
        {
            if (FileWatcher != null)
            {
                FileWatcher.Dispose();
                FileWatcher = null;
            }
        }
        catch
        {
            // ignored
        }
    }

}

知道文件夹后,只需实例化DirectoryRefresh。当您想要停止它时,您只需处置它。

当然,不要将监视程序放入您的表单中

可以使用的模式如下所示:

public class DirectoryRefresher : IDisposable
{
    private FileSystemWatcher FileWatcher { get; set; }

    public DirectoryRefresher(string directorypath)
    {
        FileWatcher = SetupFileWatcher(directoryPath);
    }

    protected FileSystemWatcher SetupFileWatcher(string path)
    {
        var watcher = new FileSystemWatcher(path);

        watcher.Changed += (sender, e) => { DoYourProcessing(e.FullPath); };
        watcher.Created += (sender, e) => { DoYourProcessing(e.FullPath); };
        watcher.Deleted += (sender, e) => { DoYourProcessing(e.FullPath); };

        watcher.EnableRaisingEvents = true;

        return watcher;
    }

    public void DoYourProcessing(string filePath)
    {
        ...
    }

    public void Dispose()
    {
        try
        {
            if (FileWatcher != null)
            {
                FileWatcher.Dispose();
                FileWatcher = null;
            }
        }
        catch
        {
            // ignored
        }
    }

}

知道文件夹后,只需实例化DirectoryRefresh。当你想阻止它的时候,你只要把它处理掉。

我试试看。谢谢你的提示:)我一直在想如何修复它,但我做不到:如果我以这种方式使用juse,我将无法访问父类上的变量(它们受到保护)。如果我在这个类中创建一个新的内容实例,它将收到一个没有数据的新副本。如果没有看到一些代码,我很难理解您的完整场景。如果一个单独的类不适合您的使用,您可以将FileSystemWatcher附加到“父”类,该类AFAICT包含您的所有应用程序逻辑。只需保留FileWatcher属性和安装方法,并插入DoYourProcessing,重用现有逻辑。我将尝试一下。谢谢你的提示:)我一直在想如何修复它,但我做不到:如果我以这种方式使用juse,我将无法访问父类上的变量(它们受到保护)。如果我在这个类中创建一个新的内容实例,它将收到一个没有数据的新副本。如果没有看到一些代码,我很难理解您的完整场景。如果一个单独的类不适合您的使用,您可以将FileSystemWatcher附加到“父”类,该类AFAICT包含您的所有应用程序逻辑。只需保留FileWatcher属性、安装方法并插入DoYourProcessing,重用现有逻辑即可。FileSystemWatcher是一项昂贵的操作,人们在当前应用程序对硬盘中的文件或文件夹的更改非常敏感时使用它,如果不是真的需要,则不应使用它。根据前面的问题,您正在开发一个将文件类型转换为其他文件类型的工具。这是没有必要实现这个技术。我已经被要求实现一个热文件夹系统-所以。。。FileSystemWatcher是我的人:)FileSystemWatcher是一个昂贵的操作,人们在当前应用程序对硬盘中的文件或文件夹的更改高度敏感时使用它,如果不是真的需要,就不应该使用它。根据前面的问题,您正在开发一个将文件类型转换为其他文件类型的工具。这是没有必要实现这个技术。我已经被要求实现一个热文件夹系统-所以。。。FileSystemWatcher是我的人:)