C#学习教程:用于FTP的FileSystemWatcher这个想法是,每当我向FTP位置添加任何内容时,我都希望将其复制到我的本地计算机。任何想法都会有所帮助。这是我之前的问题SelectiveFTPdownloadsusing.NET的后续。您将不得不实施轮询解决方案,定期询问目录内容。将其与上次调用的缓存列表进行比较并确定发生了什么。不幸的是,FTP协议中没有任何东西可以帮助您解决这个问题。FileSystemWatcher类通过向主机Windows操作系统注册事件来工作。因此,它仅限于在Windows系统上托管的目录的本地和UNC路径上工作。FileSystemWatcher上的MSDN文档解释了您可以使用的路径以及使用此类的一些潜在问题。如果您希望收到有关FTP站点更改的警报,则必须使用轮询机制来询问您有兴趣监视的文件或文件夹的当前状态。通过比较FTP站点的快照以了解更改并在检测到更改时引发类似事件,您将能够看到何时添加和删除文件。不幸的是,您无法检测到重命名事件,但其他更改应该很容易通过这种方式进行监控。您不能使用FileSystemWatcher或任何其他方式,因为FTP协议没有任何API来通知客户端远程目录的更改。您所能做的就是定期迭代远程树并查找更改。如果您使用支持远程树递归列表的FTP客户端库,它实际上很容易实现。不幸的是,内置的.NETFTP客户端FtpWebRequest没有。但是,例如对于WinSCP.NET程序集版本5.9(或更新版本),您可以使用Session.EnumerateRemoteFiles方法。请参阅文章“查看SFTP/FTP服务器中的更改”://设置会话选项SessionOptionssessionOptions=newSessionOptions{Protocol=Protocol.Ftp,HostName="example.com",UserName="user",Password="password",};using(Sessionsession=newSession()){//连接session.Open(sessionOptions);列表prevFiles=null;while(true){//收集文件列表if(prevFiles==null){//在第一轮中,只打印找到的文件数Console.WriteLine("Found{0}files",files.Count);}else{//然后查找与之前列表的差异IEnumerableadded=files.Except(prevFiles);if(added.Any()){Console.WriteLine("添加的文件:");foreach(添加的字符串路径){Console.WriteLine(path);}}删除IEnumerable=prevFiles.Except(files);if(removed.Any()){Console.WriteLine("删除的文件:");foreach(删除的字符串路径){Console.WriteLine(path);}}}prevFiles=文件;Console.WriteLine("睡觉10s...");线程.睡眠(10000);(我是WinSCP的作者)但是如果你真的只想下载更改,那么在循环中使用Session.SynchronizeDirectories会更容易。session.SynchronizeDirectories(SynchronizationMode.Local,"/remote/path",@"C:localpath",true).Check();如果您不想使用3rd方库,则必须考虑FtpWebRequest限制。有关如何使用FtpWebRequest递归列出远程目录树的示例,请参阅我的C#回答通过FTP下载所有文件和子目录。编写一个简单的服务来创建一个FileSystemWatcher,指向您的ftp位置。然后,当上传或修改文件时,将在您的服务中触发一个事件,然后您可以使用该事件将文件复制到本地计算机。File.Copy等看这个博客您可以通过以下方法监控FTP位置:publicclassFtpFileSystemWatcher{publicboolIsRunning{get;私有集;}publicstringFtpUserName{get;放;}publicstringFtpPassword{get;放;}publicstringFtpLocationToWatch{get;放;}publicstringDownloadTo{得到;放;}publicboolKeepOrignal{得到;放;}publicboolOverwriteExisting{得到;放;}publicintRecheckIntervalInSeconds{得到;放;}privateboolDownloadInprogress{得到;放;}privateSystem.Timers.TimerJobProcessor;publicFtpFileSystemWatcher(stringFtpLocationToWatch="",stringDownloadTo="",intRecheckIntervalInSeconds=1,stringUserName="",stringPassword="",boolKeepOrignal=false,boolOverwriteExisting=false){this.FtpUserName=UserName;this.FtpPassword=密码;this.FtpLocationToWatch=FtpLocationToWatch;this.DownloadTo=DownloadTo;this.KeepOrignal=KeepOrignal;this.RecheckIntervalInSeconds=RecheckIntervalInSeconds;这个.OverwriteExisting=OverwriteExisting;if(this.RecheckIntervalInSeconds{try{this.IsRunning=true;string[]FilesList=GetFilesList(this.FtpLocationToWatch,this.FtpUserName,this.FtpPassword);if(FilesList==null||FilesList.Lengthi处理方式这是上传一个名为“.ftpComplete”的单元素字节数组FileSystemWatcher只监控“.ftpComplete”文件并在最后删除它以了解实际上传的文件。由于“.ftpComplete”文件只有1个单词部分,所以上传与在FTP服务器上创建它一样快,因此一旦您对主上传文件执行任何操作,就可以将其删除“.ftpComplete”);request.Method=WebRequestMethods.Ftp.UploadFile;request.Credentials=newNetworkCredential(用户名,密码);request.UsePassive=true;request.UseBinary=true;request.KeepAlive=false;byte[]缓冲区=newbyte[1];StreamreqStream=request.GetRequestStream();reqStream.Write(buffer,0,buffer.Length);reqStream.Close();您可以使用Robo-FTP脚本来监视对FTP站点的更改。这是一个示例脚本的链接,该脚本会在检测到更改时发送电子邮件:http://kb.robo-ftp.com/script_library/show/40我查看了您之前链接到的问题。我认为您应该能够修改Robo-FTP示例并使用带有/split选项的SETLEFT命令让它解析更改文件的文件夹名称和ISO文件编号,然后将文件移动到正确的位置。以上就是C#学习教程的全部内容:FTP的FileSystemWatcher。如果对您有用,需要进一步了解C#学习教程,希望您多多关注---本文收集自网络,不代表立场。如涉及侵权,请点击右边联系管理员删除。如需转载请注明出处:
