文件系统观察器和大文件varfsw=newFileSystemWatcher(sPath,"*.PPF");fsw.NotifyFilter=NotifyFilters.FileName;fsw.IncludeSubdirectories=true;fsw.Created+=FswCreated;fsw.EnableRaisingEvents=true;staticvoidFswCreated(objectsender,FileSystemEventArgse){stringsFile=e.FullPath;字符串[]arrLines=File.ReadAllLines(sFile);对于大文件,这会失败,因为写入文件时该过程尚未完成。该文件是通过网络复制的,所以我不知道文件的大小。需要什么样的同步才能使其健壮?在stackoverflow上找到了一个解决方案,稍微修改了一下。staticboolIsFileLocked(FileInfo文件){FileStreamstream=null;尝试{stream=file.Open(FileMode.Open,FileAccess.ReadWrite,FileShare.None);}catch(IOException){//文件不可用,因为它://仍在写入//或正在被另一个线程处理//或不存在(已被处理)returntrue;}finally{if(stream!=null)stream.Close();}//文件没有被锁定returnfalse;}staticvoidFswCreated(objectsender,FileSystemEventArgse){stringsFile=e.FullPath;Console.WriteLine("处理文件:"+sFile);//如果文件仍然打开则等待FileInfofileInfo=newFileInfo(sFile);while(IsFileLocked(fileInfo)){Thread.Sleep(500);}string[]arrLines=File.ReadAllLines(sFile);使用DelayedFileSystemWatcher.cs类http://blogs.msdn.com/b/ahamza/archive/2006/02/06/526222.aspx,然后使用此代码。检查PrintFileSystemEventHandler事件处理程序。它尝试读取文件流中的文件,如果有任何错误,它会假定文件仍在读取中,因此它会等待一段时间(在本例中为2秒)并再次尝试。检查转换:标签staticvoidMain(string[]args){DelayedFileSystemWatcherdfw=newDelayedFileSystemWatcher(@"C:\Test","*.*");dfw.Changed+=newFileSystemEventHandler(Program.FileSystemEventHandlerMethod);dfw.Created+=newFileSystemEventHandler(Program.FileSystemEventHandlerMethod);dfw.Deleted+=newFileSystemEventHandler(Program.FileSystemEventHandlerMethod);dfw.Error+=newErrorEventHandler(Program.ErrorEventHandlerMethod);dfw.Renamed+=newRenamedEventHandler(Program.RenamedEventHandlerMethod);dfw.IncludeSubdirectories=true;dfw.ConsolidationInterval=1000;dfw.EnableRaisingEvents=true;Console.WriteLine("Press'q'toquitthesample.");while(Console.Read()!='q');//System.Threading.Thread.Sleep(60000);dfw.Dispose();}privatestaticvoidFileSystemEventHandlerMethod(objectsender,FileSystemEventArgse){PrintFileSystemEventHandler(e);System.Console.WriteLine();}privatestaticvoidErrorEventHandlerMethod(object发件人,ErrorEventArgse){System.Console.WriteLine(e.GetException().Message);System.Console.WriteLine();}privatestaticvoidRenamedEventHandlerMethod(objectsender,RenamedEventArgse){PrintRenamedEventHandler(e);System.Console.WriteLine();}privatestaticvoidPrintFileSystemEventHandler(FileSystemEventArgse){转换:尝试{if(e.ChangeType!=WatcherChangeTypes.Deleted){if(!isFolder(e.FullPath)&&isFile(e.FullPath)){FileStreamfs=newFileStream(e.FullPath、FileMode.Open、FileAccess.Read、FileShare.None);fs.Close();}}System.Console.WriteLine(e.Name+""+e.FullPath+""+e.ChangeType);}catch(System.IO.IOException){Console.WriteLine("出现IOException错误或文件仍在复制。2秒后重试...");系统.Threading.Thread.Sleep(2000);转到转换;}//System.Console.WriteLine(e.Name);//System.Console.WriteLine(e.FullPath);//System.Console.WriteLine(e.ChangeType);}私有状态cboolisFolder(stringstrPath){boolisFolderExist=false;尝试{isFolderExist=Directory.Exists(strPath);}catch{isFolderExist=false;}返回isFolderExist;}privatestaticboolisFile(stringstrPath){boolisFileExist=false;}catch{isFileExist=false;返回isFileExist;}privatestaticvoidPrintRenamedEventHandler(RenamedEventArgse){PrintFileSystemEventHandler(e);System.Console.WriteLine(e.OldName);系统。Console.WriteLine(e.OldFullPath);我没有该项目的链接,但这会有所帮助。我支持ShayErlichmen接受的解决方案。但是,a)您可能不想使用FileAccess.Read访问模式打开文件,将其保留为只读文件b)某些程序在下载文件时和完成后会在文件上添加一些有趣的扩展名,扩展名会改变,虽然文件已经完成,但是你会得到一个找不到文件的异常。因此处理异常,并订阅file.renamed事件AFAIK复制完成后您不会收到通知,您可以实施重试机制。如果您遇到切割违规,只需触发一个计时器在X秒后重试该操作。第二次重试应该在X*2秒之后,依此类推(当然有一些限制)。如果可能,就在您的fswCreated中,使用Thread.Sleep(500)休眠大约1/2秒。这应该给您计算机完成文件写入所需的时间。当然,对于较慢的硬盘驱动器,这个时间可能不够,也可能不够。以上就是C#学习教程的全部内容:文件系统观察程序和大文件共享。如果对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
