sat*_*jit 8 c# multithreading filesystemwatcher
我正在下载文件,并希望在下载完成后才执行安装.我该如何做到这一点?好像FileSystemWatcher onCreate事件会这样做,但这发生在另一个线程中,是否有一种简单的方法可以强制等待部分在同一个线程中发生.
我到目前为止的守则
FileSystemWatcher w = new FileSystemWatcher(@"C:/downloads");
w.EnableRaisingEvents = true;
w.Created += new FileSystemEventHandler(FileDownloaded);
static void FileDownloaded(object source, FileSystemEventArgs e)
{
InstallMSI(e.FullPath);
}
Run Code Online (Sandbox Code Playgroud)
我查看了SynchronizingObject和WaitForChangedResult,但没有获得可靠的工作样本.
ukh*_*rdy 14
尝试:
FileInfo fInfo = new FileInfo(e.FullPath);
while(IsFileLocked(fInfo)){
Thread.Sleep(500);
}
InstallMSI(e.FullPath);
static bool IsFileLocked(FileInfo file)
{
FileStream stream = null;
try {
stream = file.Open(FileMode.Open, FileAccess.ReadWrite, FileShare.None);
}
catch (IOException) {
return true;
}
finally {
if (stream != null)
stream.Close();
}
return false;
}
Run Code Online (Sandbox Code Playgroud)
如果您坚持使用FileSystemWatcher,则可能需要考虑到在单个操作中未创建(上载)某个大小的文件的事实.在文件准备好使用之前,文件系统可能会生成1 created和x changed事件.
您可以捕获created事件并创建新的(专用)线程(除非您已经有该文件的持续线程),您可以在其中循环并定期尝试以独占方式打开该文件.如果成功,文件就准备好了.
| 归档时间: |
|
| 查看次数: |
12712 次 |
| 最近记录: |