我正在使用FileSystemWatcher(在ASP.NET Web应用程序中)监视文件以进行更改.观察者在Singleton类的构造函数中设置,例如:
private SingletonConstructor()
{
var fileToWatch = "{absolute path to file}";
var fsw = new FileSystemWatcher(
Path.GetDirectoryName(fileToWatch),
Path.GetFileName(fileToWatch));
fsw.Changed += OnFileChanged;
fsw.EnableRaisingEvents = true;
}
private void OnFileChanged(object sender, FileSystemEventArgs e)
{
// process file...
}
Run Code Online (Sandbox Code Playgroud)
到目前为止一切正常.但我的问题是:
使用局部变量(var fsw)设置观察者是否安全?或者我应该在私有字段中保留它的引用,以防止它被垃圾收集?
我有一个FileSystemWatcher监视网络共享上的文件.如果发生事件以使共享不可用,可能是由于网络问题,FileSystemWatcher将断开连接.
显然我可以处理"错误"事件,也许做一些日志记录,很多文章建议在错误事件处理程序中重新连接FSW.
但是,如果网络共享在错误事件中仍然不可用,该怎么办?然后我需要引入一个计时器来测试网络共享是否可用并尝试重新连接FSW.
1)有更好的方法吗?
2)是否有一个属性允许我确定FSW已与文件断开连接?我注意到FSW的一个非公共成员"stopListening",当FSW断开连接时,它似乎设置为true.但这并未公开曝光
任何帮助,将不胜感激 ...
谢谢凯文
我必须创建一个程序来监视文件大小的变化.我已经制作了一个简单的Windows服务和filesystemwatcher,所以我现在熟悉这个概念.我还制作了一个代码,用于检查filesize(在表单按钮中创建)但尚未在我的filesystemwatcher中实现.如何创建具有监视文件大小的filewatcher的Windows服务?我是否必须在Windows服务中放置filesystemwatcher并通过OnStart方法调用观察者?
我在这里和整个网络上遇到了几个"解决方案"但似乎没有一个符合要求.
我要做的是让app监视新文件的文件夹(通过创建,移动或复制)并对这些对象执行操作.就是这种情况,我转向FileSystemWatcher类来执行此操作.
问题是文件FileSystemWatcher.Created事件在创建整个文件之前被触发(最明显的是通过大文件的副本看到).
有没有办法让这个事件在文件创建结束时触发而不是从头开始?我尝试过FileSystemWatcher.NofityFilter属性的各种组合但没有成功.
提前致谢!:)
我打算创建一个应用程序,它将查看创建的任何文件的目录.非常简单的时间来使用filesystemwatcher.我的问题涉及如何利用它.通常的做法是使用Windows服务来确保应用程序始终运行?
我一直试图摆脱构建Windows服务,如果我不需要,但我真的没有看到在这种情况下这样做的替代方案.通常,我会将我的服务转换为控制台应用程序并使用Windows调度程序安排它,但这并不适用于这种情况.
任何人都可以推荐一种比Windows服务更好的方式来实现filesystemwatcher吗?
谢谢你的想法.
编辑 以回应下面的评论,更具体地说,我只需要在服务器上查看目录,并且当创建新文件时,我必须将该文件的副本移动到同一服务器上的不同目录中,也许重命名它在这个过程中.
文件的频率和数量将非常小.一天最多可能5-10.
我正在下载文件,并希望在下载完成后才执行安装.我该如何做到这一点?好像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,但没有获得可靠的工作样本.
我想在文件系统中轮询任何已更改,添加或删除的文件或子目录.应尽快检测所有更改,但不要对机器施加压力.操作系统是Windows> = Vista,观察到的部分是本地目录.
通常情况下,我会使用FileSystemWatcher,但这会导致其他程序试图查看相同位置的问题(突出显示,Windows资源管理器).另外,我听说FSW即使对于本地文件夹和大缓冲区也不是很可靠.
我遇到的主要问题是文件和目录的数量可能非常大(猜数为7位).只需每秒检查一次所有文件就会对我的机器造成明显影响.
我的下一个想法是每秒检查整棵树的不同部分以减少整体影响,并可能添加一种启发式方法,例如检查经常更快地更改的文件.
我想知道是否有这种问题的模式,或者是否有人有这种情况的经验.
我正在使用Java7的新功能来查看目录以进行更改(如以下教程中所述:http://download.oracle.com/javase/tutorial/essential/io/notification.html)
观看本身(几乎)没有问题.
或多或少我有两个问题,我希望你们中的一些人知道如何处理它.
添加一个文件夹进行监视后,VM可以访问它并且不会释放它.这应该不是一个大问题.但是,如果您要在另一个目录中创建一个目录,那么还要创建一个目录.(例如,你在目录中创建c:\tmp\a的目录b和b目录c(c:\tmp\a\b\c)),它是无法删除的目录a,因为虚拟机的访问,b和c.如果要删除所有文件夹(例如,使用Windows资源管理器)c,则必须先删除,然后b再删除a.这很奇怪,但这种方式有效(虽然不方便)
这个问题似乎是第一个问题的结果.如果a有时会发生很多变化(或多或少)我得到一个异常,告诉我,新创建的文件夹被另一个进程使用,并且无法访问它.这很奇怪,因为我认为收到通知并不重要.并且因为在完全抛出此异常时并不完全清楚.
你有没有想法如何使没有锁或至少让用户能够以经典方便的方式删除这样的目录结构?
如何避免C#中FileSystemWatcher的错误?
目录中一次更改太多
我必须检测网络共享上的所有更改.InternalBufferSize增加到8192*128