我正在使用Java 7,java.nio.file.WatchEvent以及WatchService.注册后,当我轮询ENTRY_MODIFY事件时,我无法访问该事件的文件的绝对路径.有没有办法从WatchEvent对象到达文件的绝对路径?
我们有一个应用程序需要处理放入目录的传入文件.我正在寻找最好的方法来做到这一点.
我们一直在使用循环的Backgroundrb过程,但是,说实话,Backgroundrb是不可靠的,如果可能的话,我们想要远离它.
Delayed_job似乎不是用于正在进行的任务,而是用于一次性.
我发现DirectoryWatcher http://codeforpeople.rubyforge.org/directory_watcher/看起来很有前景,但理想情况下我们希望对此有一些控制权,并且能够监控它是否正常运行.
所以要求是:
感谢您的任何意见!这应该不难,我很惊讶我找不到其他人在网上谈论这个,因为我认为在商业应用中这并不罕见.
我有一个Windows服务,目前正在实例化大约十几个FileSystemWatcher实例,以监控整个公司网络中的共享文件夹,以便处理文件.
我正在考虑添加更多实例,所以我想知道这里是否有人(生产系统)有关FileSystemWatcher生产系统可以可靠处理的实例数量的实际限制是什么?
编辑:在我的情况下,不修改InternalBufferSize属性,因此InternalBufferSize是默认的8 KB ...我假设InternalBufferSize的增加会影响FileSystemWatcher系统可以同时运行的实例数,因此这也是方程的一部分. ..
编辑:如果您认为这仅仅是一个资源问题,它只取决于系统的可用内存量或其他一些硬件方面,请分享您的经验或链接到证实您的意见的文档或文章...我会真的很想听听那些在生产中达到极限的人,无论他们的硬件规格如何,所以请在投票之前仔细考虑其他7个人在不到20分钟的时间内表示有兴趣听取那些推动限制的人...
出于某种原因,我FileSystemWatcher没有发动任何事件.我想知道在我的目录中创建,删除或重命名新文件的任何时间._myFolderPath正确设置,我已经检查过了.
这是我目前的代码:
public void Setup() {
var fileSystemWatcher = new FileSystemWatcher(_myFolderPath);
fileSystemWatcher.NotifyFilter = NotifyFilters.LastAccess |
NotifyFilters.LastWrite | NotifyFilters.FileName | NotifyFilters.DirectoryName;
fileSystemWatcher.Changed += FileSystemWatcherChanged;
fileSystemWatcher.Created += FileSystemWatcherChanged;
fileSystemWatcher.Deleted += FileSystemWatcherChanged;
fileSystemWatcher.Renamed += FileSystemWatcherChanged;
fileSystemWatcher.Filter = "*.*";
fileSystemWatcher.EnableRaisingEvents = true;
}
private void FileSystemWatcherChanged(object sender, FileSystemEventArgs e)
{
MessageBox.Show("Queue changed");
listBoxQueuedForms.Items.Clear();
foreach (var fileInfo in Directory.GetFiles(_myFolderPath, "*.*", SearchOption.TopDirectoryOnly))
{
listBoxQueuedForms.Items.Add(fileInfo));
}
}
Run Code Online (Sandbox Code Playgroud) 到目前为止,我知道FileSystemWatcher可以查看一个文件夹,如果该文件夹中的任何文件被更改,修改,.etc ...然后我们就可以处理它.但我不确定在我的场景中应该使用哪个过滤器和事件:观察文件夹,如果文件被添加到该文件夹,请执行XYZ ...所以在我的场景中我不关心现有文件是否已更改等等.应该忽略这些...当且仅当新文件被添加到该文件夹时才执行XYZ ...
您为此方案推荐了哪个事件和过滤器?
什么是使用C#中的FileSystemWatcher监视多个文件夹(而不是子目录)的最佳方法?
关于这个话题不乏问题,但我仍然遇到麻烦.这是我的情况.我有一个服务,我需要观看配置文件中指定的路径.当我使用本地驱动器时,它工作得很好.
但是,当我将其更改\\server2\secondary\temp\watch_folder为服务无法启动时.日志中的错误是
目录名称\\ server2\secondary\temp\watch_folder无效.
如果我将其直接复制到Windows资源管理器中,该文件夹打开正常 如果我将我的代码粘贴到旧的Winforms应用程序中,它可以正常工作.我已经尝试了所有"登录身份"帐户.我将其设置为使用管理员帐户,但仍然没有骰子.
这是我的代码:
_watcher = new FileSystemWatcher();
_watcher.Path = ConfigurationManager.AppSettings["WatchFolder"];
_watcher.NotifyFilter = NotifyFilters.LastWrite | NotifyFilters.FileName;
_watcher.Filter = "*.txt";
_watcher.Created += new FileSystemEventHandler(OnCreated);
_watcher.Error += new ErrorEventHandler(OnError);
_watcher.EnableRaisingEvents = true;
Run Code Online (Sandbox Code Playgroud)
有任何想法吗?我很茫然,此时我觉得我已经盯着它看了太久.我真诚地感谢任何帮助.
谢谢,尼克
编辑 以下是例外情况:
服务无法启动.System.ArgumentException:目录名\ server2\Secondary\temp\watch_folder无效. System.Service.File 上的FileWatcher.FileWatcher.Watch() 处的File.IO.FileSystemWatcher.set_Path
(String value )处于System.ServiceProcess.ServiceBase.ServiceQueuedMainCallback(Object state)中的FileWatcher.FileWatcher.OnStart(String [] args )
在python核心中找不到任何东西来做这件事.任何人都可以推荐一个库或"电池"来做到这一点?理想情况下,我希望这是可移植的,但如果它只适用于Unix(我的服务器),那就没关系.
有没有人在框架4中使用过FileSystemWatcher并且遇到过任何问题?
我在Windows服务中使用它,我无法承受它失败.
我从朋友那里听说它不太可靠,但我现在已经测试了几个小时,我没有遇到任何问题,但我仍然怀疑使用它.....
我将不胜感激任何有关此事的建议,我不想将应用程序交付给客户,然后意识到这件事会崩溃....
谢谢
谢谢你们的建议
我想我的目的应该没问题.它将检查服务器本地驱动器上的文件夹,所有检查是否文件已被修改,所以我认为它应该没问题
我意识到FileSystemWatcher不提供Move事件,而是为同一个文件生成单独的Delete和Create事件.(FilesystemWatcher正在观察源文件夹和目标文件夹).
但是,我们如何区分真正的文件移动和一些文件的随机创建,该文件恰好与最近删除的文件同名?
FileSystemEventArgs类的某种属性,例如"AssociatedDeleteFile",如果它是移动的结果,则分配已删除的文件路径,否则为NULL,这将是很好的.但当然这不存在.
我也理解FileSystemWatcher在基本的文件系统级别运行,因此"移动"的概念可能仅对更高级别的应用程序有意义.但如果是这种情况,人们会建议在我的应用程序中使用什么样的算法来处理这种情况?
根据反馈更新:
FileSystemWatcher类似乎看到将文件移动为2个不同的事件,删除原始文件,然后在新位置创建.
不幸的是,这些事件之间没有提供"链接",因此如何区分文件移动和普通的删除或创建并不明显.在操作系统级别,移动被特别处理,您可以几乎立即移动说1GB文件.
一些答案建议在文件上使用散列来在事件之间可靠地识别它们,我将合理地采用这种方法.但如果有人知道如何更简单地发现一个动作,请留下答案.