0

我正在尝试观察连接到我的 PC 的所有 USB 存储设备中的文件发生的变化。为此,我编写了 ac# 控制台应用程序,但它仅提供一个空白屏幕并不能正常工作。请有人帮我这样做

班级

    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.");




        }
}
4

1 回答 1

1

我发现的关键问题是控制台在启动线程后立即退出(因此 while not 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.");
    }
}

根据要求添加输出:

输入:输入

输出:输出

于 2016-04-07T15:17:08.043 回答