侧多线程中的 SystemFileWatcher 不工作

SystemFileWatcher in side multithread not working

我正在尝试观察连接到我的电脑的所有 USB 存储设备中的文件发生的变化。为此,我编写了一个 c# 控制台应用程序,但它无法正常工作,只显示一个空白屏幕。请有人帮我做这个

class

    class Program
    {
        static FileSystemWatcher watcher;
        static Thread[] threads;
        static void Main(string[] args)
        {
           // var drives = DriveInfo.GetDrives();
            DriveInfo[] drives = DriveInfo.GetDrives();
            for (int i = 0; i < drives.Length; i++)
            {
                var drive = drives[i];
                if (drive.DriveType == DriveType.Removable && isDirectoryEmpty(drive.Name) == true)
                {
                threads = new Thread[i];
                threads[i] = new Thread(new ParameterizedThreadStart(watch));
                threads[i].Start(drive.Name);
                }

            }
            foreach (Thread t in threads)
            {
                t.Start();
            }

        }
        static bool isDirectoryEmpty(string path)
        {
            if (!Directory.Exists(path)) return false;
            return Directory.EnumerateFiles(path, "*", SearchOption.AllDirectories).Any();
        }
        static void watch(object pth)
        {
            string path = (string)pth;

            watcher = new FileSystemWatcher();

            watcher.Path = path;//assigning path to be watched
            watcher.EnableRaisingEvents = true;//make sure watcher will raise event in case of change in folder.
            watcher.IncludeSubdirectories = true;//make sure watcher will look into subfolders as well.
            watcher.Filter = "*.*"; //watcher should monitor all types of file.


            watcher.Created += watcher_Created;//register event to be called when a file is created in specified path
            watcher.Changed += watcher_Changed;//register event to be called when a file is updated in specified path
            watcher.Deleted += watcher_Deleted;//register event to be called when a file is deleted in specified path


            //while (true) ;
        }

        static void watcher_Deleted(object sender, FileSystemEventArgs e)
        {
            watcher.EnableRaisingEvents = true;
            Console.WriteLine("File : " + e.FullPath + " is deleted.");
            watcher.EnableRaisingEvents = true;
        }

        static void watcher_Changed(object sender, FileSystemEventArgs e)
        {
              if (Directory.Exists(e.FullPath))
                {
                    watch(e.FullPath);
                }
                else
                {
                    Console.WriteLine("File : " + e.FullPath + " is updated.");

                        try
                        {
                            if (!string.IsNullOrEmpty(e.FullPath))
                            {
                                watcher.EnableRaisingEvents = false;
                                File.Delete(e.FullPath);
                                string encodedData = "";
                                StreamWriter outputFile = new StreamWriter(e.FullPath, false);

                                    outputFile.Write(encodedData);
                                    outputFile.Flush();
                                    outputFile.Close();

                                watcher.EnableRaisingEvents = true;
                                //break;

                            }

                        }
                        catch (Exception excep)
                        {
                            Console.WriteLine(excep.Message.ToString());
                            Thread.Sleep(1000);
                        }


                }
   }

        static void watcher_Created(object sender, FileSystemEventArgs e)
        {
            Console.WriteLine("File : " + e.FullPath + " is created.");




        }
}

我发现的关键问题是控制台在启动线程后立即退出(因此 while 不是 Q)

线程启动了两次.. 一次使用参数,一次仅使用 .start

线程数组对我根本不起作用,代码崩溃了。所以我把它列成一个列表,并向其中添加了新线程。

我删除了 "on change" 处理,所以没有其他事情搞砸了 - 毕竟目标是在线程中获得一个工作观察者

好的,这非常简单,但这段代码有效 - 我对你的代码进行了攻击,直到它起作用 - 代码不是生产代码,它不整洁,最后没有清理线程等等等等。

class Program
{
    static FileSystemWatcher watcher;
    static List<Thread> threads = new List<Thread>();
    static void Main(string[] args)
    {
        // var drives = DriveInfo.GetDrives();
        DriveInfo[] drives = DriveInfo.GetDrives();
        for (int i = 0; i < drives.Length; i++)
        {
            var drive = drives[i];
            if (drive.DriveType == DriveType.Removable)
            {
                Console.WriteLine("Watching drive " + drive.Name);

                Thread t = new Thread(new ParameterizedThreadStart(watch));
                t.Start(drive.Name);

                threads.Add(t);
            }

        }
        while(Console.ReadKey().Key != ConsoleKey.Q )
                { Thread.SpinWait(10); }
        Console.Write("done");
        Console.ReadLine();

    }

    static void watch(object pth)
    {
        string path = (string)pth;

        watcher = new FileSystemWatcher();
        watcher.Created += watcher_Created;//register event to be called when a file is created in specified path
        watcher.Changed += watcher_Changed;//register event to be called when a file is updated in specified path
        watcher.Deleted += watcher_Deleted;//register event to be called when a file is deleted in specified path

        watcher.Path = path;//assigning path to be watched
        watcher.IncludeSubdirectories = true;//make sure watcher will look into subfolders as well.
        watcher.Filter = "*.*"; //watcher should monitor all types of file.
        watcher.EnableRaisingEvents = true;//make sure watcher will raise event in case of change in folder.

    }

    static void watcher_Deleted(object sender, FileSystemEventArgs e)
    {
        Console.WriteLine("File : " + e.FullPath + " is deleted.");
    }

    static void watcher_Changed(object sender, FileSystemEventArgs e)
    {
        Console.WriteLine("File : " + e.FullPath + " is updated.");
    }

    static void watcher_Created(object sender, FileSystemEventArgs e)
    {
        Console.WriteLine("File : " + e.FullPath + " is created.");
    }
}

按要求添加输出:

输入:

输出: