我有一个应用程序,监听在选定文件夹中的* .log文件。我用 FileSystemWatcher的。
但有一个问题。负责制定该文件的其他应用程序需要以下步骤:
和我不能改变这种行为。
所以我做了2 FileSystemWatcher的 S代表*。广州和* .txt文件。为什么?因为这个程序有时不能解压GZ文件,有时不会重命名的txt文件到最终* .log文件。
FileSystemWatcher2 捕捉txt文件,然后(在它被重命名为下次登录1000毫秒大多数情况下)我需要等待一些时间来检查,如果txt文件存在(如果没有,它似乎被重命名为最终的* .log文件)。
现在的问题是,如何检查文件是否存在,而不 Thread.sleep代码()防止冻结用户界面?
我希望它是明确的,如果没有,我会尽力来形容它更好。我觉得这是一个复杂的问题。
一些示例代码:
看守的GZ文件:
私人无效fileSystemWatcher_Created(对象发件人,FileSystemEventArgs E) { //这是GZ文件的情况下,如果GZ文件不被其他应用程序自动解压缩//我需要等待,并检查是否GZ解包,如果没有,我自己解压, //然后TXT观察家将赶上 Thread.sleep代码(5000); 如果(File.Exists(e.FullPath)) {试 {字节[] =的DataBuffer新的字节[4096];使用(的System.IO.Stream FS =新的FileStream(e.FullPath, FileMode.Open, FileAccess.Read)) {使用(GZipInputStream gzipStream =新GZipInputStream(FS)) {串fnOut = Path.Combine(path_to_watcher, Path.GetFileNameWithoutExtension(e.FullPath));使用 (的FileStream FSOUT = File.Create(fnOut)) { StreamUtils.Copy(gzipStream,FSOUT,设置DataBuffer); } } } } 赶上{//忽略} } }守望者为txt文件:
私人无效fileSystemWatcher2_Created(对象发件人,FileSystemEventArgs E) { //这是为txt文件 Thread.sleep代码(3500); 如果(File.Exists(e.FullPath)) { //让自己的行动} ,否则 { //让自己的行动} }解决方案
其实FileSystemWatcher对象的被称为由.NET本身单独的线程创建活动的..所以基本上您需要做的绝对没有。你的代码是OK,因为它是
下面就是证明:
类节目 {静态无效的主要(字串[] args) { FileSystemWatcher的FW =新FileSystemWatcher的(@C:\temp); fw.Created + = fileSystemWatcher_Created; Console.WriteLine(Thread.CurrentThread.ManagedThreadId); fw.EnableRaisingEvents = TRUE; 到Console.ReadLine(); } 静态无效fileSystemWatcher_Created(对象发件人,FileSystemEventArgs E) { Console.WriteLine(Thread.CurrentThread.ManagedThreadId); } }
I have an app, listening for the *.log file in a chosen folder. I used FileSystemWatcher.
But there is a problem. The other app responsible for making that file takes following steps:
And I can not change this behaviour.
So I made 2 FileSystemWatchers for *.gz, and *.txt files. Why? Because this app sometimes doesn't unpack the gz file, and sometimes doesn't rename the txt file to the final *.log file.
FileSystemWatcher2 catches txt file, then (in the most cases it is renamed to log in the next 1000ms) I need to wait some time to check if txt file exists (if not, it seems to be renamed to the final *.log file).
The question is, how to check if file exists without Thread.Sleep() to prevent UI freeze?
I hope it is clear, if not I will try to describe it better. I think this is a complex problem.
Some code sample:
Watcher for gz file:
private void fileSystemWatcher_Created(object sender, FileSystemEventArgs e) { //this is for gz files in case if gz file is not unpacked automatically by other app //I need to wait and check if gz was unpacked, if not, unpack it by myself, //then txt watcher will catch that Thread.Sleep(5000); if (File.Exists(e.FullPath)) { try { byte[] dataBuffer = new byte[4096]; using (System.IO.Stream fs = new FileStream(e.FullPath, FileMode.Open, FileAccess.Read)) { using (GZipInputStream gzipStream = new GZipInputStream(fs)) { string fnOut = Path.Combine(path_to_watcher, Path.GetFileNameWithoutExtension(e.FullPath)); using (FileStream fsOut = File.Create(fnOut)) { StreamUtils.Copy(gzipStream, fsOut, dataBuffer); } } } } catch { //Ignore } } }Watcher for txt file:
private void fileSystemWatcher2_Created(object sender, FileSystemEventArgs e) { //this is for txt file Thread.Sleep(3500); if (File.Exists(e.FullPath)) { //make my actions } else { //make my actions } }解决方案
Actually FileSystemWatcher Created event called in separate thread by .NET itself.. So basically you need to do absolutely nothing. Your code is OK as it is.
Here is the proof:
class Program { static void Main(string[] args) { FileSystemWatcher fw = new FileSystemWatcher(@"C:\temp"); fw.Created += fileSystemWatcher_Created; Console.WriteLine(Thread.CurrentThread.ManagedThreadId); fw.EnableRaisingEvents = true; Console.ReadLine(); } static void fileSystemWatcher_Created(object sender, FileSystemEventArgs e) { Console.WriteLine(Thread.CurrentThread.ManagedThreadId); } }
更多推荐
如何要等到File.Exists?
发布评论