侧多线程中的 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.");
}
}
按要求添加输出:
输入:
输出:
我正在尝试观察连接到我的电脑的所有 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.");
}
}
按要求添加输出:
输入:
输出: