C#FileSystemWatcher监视网络驱动器上的更改,这只能由当前系统完成

时间:2018-02-05 06:30:57

标签: c# filesystemwatcher

我正在关注FileSystemWatcher的{​​{3}}示例。在此基础上,我创建了Windows窗体应用程序,只要在Z驱动器中创建并重命名任何.txt文件,它就会打开。

我构建了控制台应用程序并部署到两个系统,两个系统都在监听同一个网络驱动器(我已将网络驱动器映射为两个系统中的Z驱动器)

然而,问题是每当我在网络驱动器中创建或重命名.txt文件时,两个系统的表单都打开,这是合乎逻辑的,因为两个部署的控制台应用程序都在监听相同的位置。

  

但我的要求是"表单应仅在该系统中打开   谁正在执行创建或重命名.txt文件的操作。"

     

有什么办法可以实现这个目标,或者fileSystemWatcher类是否可以实现这一目标?

以下是代码段。

public class Watcher
{

    public static void Main()
    {
        Run();

    }

    [PermissionSet(SecurityAction.Demand, Name = "FullTrust")]
    public static void Run()
    {
        string[] args = System.Environment.GetCommandLineArgs();


        FileSystemWatcher watcher = new FileSystemWatcher("Z:\\", "*.txt");
        watcher.NotifyFilter = NotifyFilters.LastAccess | NotifyFilters.LastWrite
           | NotifyFilters.FileName | NotifyFilters.DirectoryName;
        watcher.IncludeSubdirectories = true;
        // Add event handlers.
        //watcher.Changed += new FileSystemEventHandler(OnChanged); //Fires everytime files is changed (mulitple times in copy operation)
        watcher.Created += new FileSystemEventHandler(OnChanged);
        watcher.Deleted += new FileSystemEventHandler(OnChanged);
        watcher.Renamed += new RenamedEventHandler(OnRenamed);

        // Begin watching.
        watcher.EnableRaisingEvents = true;

        // Wait for the user to quit the program.
        Console.WriteLine("Press \'q\' to quit the sample.");
        while (Console.Read() != 'q') ;
    }

    // Define the event handlers.
    private static void OnChanged(object source, FileSystemEventArgs e)
    {
        // Specify what is done when a file is changed, created, or deleted.
        Console.WriteLine("File: " + e.FullPath + " " + e.ChangeType);
        Application.EnableVisualStyles();
        Application.Run(new Feedback.Form1(e.FullPath));//Here I am opening new form for feedback
    }

    private static void OnRenamed(object source, RenamedEventArgs e)
    {
        // Specify what is done when a file is renamed.
        Console.WriteLine("File: {0} renamed to {1}", e.OldFullPath, e.FullPath);
        Application.EnableVisualStyles();
        Application.Run(new Feedback.Form1(e.FullPath));//Here I am opening new form for feedback
    }
}

2 个答案:

答案 0 :(得分:2)

FileSystemWatcher 可以通知您发生了某事,并且您可能也能够推断什么发生了,但不要指望它。在我的(和others)体验中,这是一个非常有限且不可靠的组件。因此,如果目标文件夹上存在任何中等争用的可能性,我会使用某种轮询解决方案而不是文件观察器。

那就是说,它不会告诉你做了改变。一旦推断出 已更改的内容,您需要为“who”部分采取其他步骤。文件系统存储相当稀疏的信息,您将找不到任何源机器信息。您可以尝试映射使用不同用户创建这些更改的文件共享,因为您可以从中推断出修改系统: Finding the user who modified the shared drive folder files

如果这不是一个选项,其他解决方案要复杂得多。

如果您有权访问托管Z的服务器:您可以打开该资源的file audit log并从事件日志中推断出该机器的用户(事件ID 4663/5145)。源机器名称将记录在他的情况下。如果它是一个Windows服务器(目录属性/安全性/高级/审计),应该轻而易举地启用它,但读取和同步日志更复杂。

如果无法使用上述任何解决方案,您可以使用类似dokan的内容实现用户空间文件系统来代理文件共享。源进程将映射您的应用程序而不是文件共享,这样您可以引发自己的事件或只是将详细的审核日志写入数据库或其他任何内容,然后将实际命令转发到文件共享。虽然非常昂贵且非平凡的解决方案。但可能很有趣。

答案 1 :(得分:0)

FileSystemWatcher为您提供有关文件更改的通知。

如果要使用文件系统进行唯一通知,则需要为每个实例创建一个独立的文件夹。

类似的东西:

Z:\ MACHINE1 \

Z:\计算机2 \

其他选项是检查谁是所有者/创建了文件,但在域设置中可能非常复杂。