我有一个应用程序,我正在寻找一个文本文件,如果对文件进行任何更改,我使用OnChanged
eventhandler来处理事件.我正在使用NotifyFilters.LastWriteTime
但事件仍被解雇两次.这是代码.
public void Initialize()
{
FileSystemWatcher _fileWatcher = new FileSystemWatcher();
_fileWatcher.Path = "C:\\Folder";
_fileWatcher.NotifyFilter = NotifyFilters.LastWrite;
_fileWatcher.Filter = "Version.txt";
_fileWatcher.Changed += new FileSystemEventHandler(OnChanged);
_fileWatcher.EnableRaisingEvents = true;
}
private void OnChanged(object source, FileSystemEventArgs e)
{
.......
}
Run Code Online (Sandbox Code Playgroud)
在我的情况下OnChanged
,当我更改文本文件version.txt
并保存时,会调用两次.
我需要设置一个应用程序来监视在本地或网络驱动器上的目录中创建的文件.
请问FileSystemWatcher
一个计时器或投票将是最好的选择.我过去曾使用过这两种方法,但并不广泛.
两种方法都存在哪些问题(性能,可靠性等)?
我正在使用Windows窗体应用程序来监视目录并将其中的文件移动到另一个目录.
目前它会将文件复制到另一个目录,但是当添加另一个文件时,它将以没有错误消息结束.有时它会在结束第三个文件之前复制两个文件.
这是因为我使用的是Windows窗体应用程序而不是控制台应用程序吗?有没有办法可以阻止程序结束并继续观看目录?
private void watch()
{
this.watcher = new FileSystemWatcher();
watcher.Path = path;
watcher.NotifyFilter = NotifyFilters.LastAccess | NotifyFilters.LastWrite
| NotifyFilters.FileName | NotifyFilters.DirectoryName;
watcher.Filter = "*.*";
watcher.Changed += OnChanged;
watcher.EnableRaisingEvents = true;
}
private void OnChanged(object source, FileSystemEventArgs e)
{
//Copies file to another directory.
}
public void Dispose()
{
// avoiding resource leak
watcher.Changed -= OnChanged;
this.watcher.Dispose();
}
Run Code Online (Sandbox Code Playgroud) 无处不在,我发现这两行代码用于为提供的样本中的文件系统观察器设置过滤器.
FileSystemWatcher watcher = new FileSystemWatcher();
watcher.Filter = "*.txt";
//or
watcher.Filter = "*.*";
Run Code Online (Sandbox Code Playgroud)
但我希望我的观察者能够监控更多的文件类型,但不是全部.我怎样才能做到这一点:
//watcher.Filter = "*.txt" | "*.doc" | "*.docx" | "*.xls" | "*.xlsx";
Run Code Online (Sandbox Code Playgroud)
我试过这些:
watcher.Filter = "*.txt|*.doc|*.docx|*.xls|*.xlsx";
// and
watcher.Filter = "*.txt;*.doc;*.docx;*.xls;*.xlsx*";
Run Code Online (Sandbox Code Playgroud)
两者都没用.这只是基础,但我想念它.谢谢..
如何监视整个目录树以查找Linux(ext3文件系统)中的更改?
目前,该目录在大约3,000个子目录中包含大约五十万个文件,以三个目录级别组织.
这些大多是小文件(<1kb,少数高达100 kb).这是一种队列,我需要知道何时创建,删除文件或在发生的5-10秒内修改其内容.
我知道有inotify和排序,但AFAIK他们只监视一个目录,这意味着在我的情况下我需要3,000个inotify句柄 - 比单个进程允许的通常1024个句柄更多.还是我错了?
如果Linux系统无法告诉我我需要什么:也许有一个FUSE项目模拟文件系统(复制真实文件系统上的所有文件访问)并单独记录所有修改(不能很好)?
当我尝试将观察者路径设置为单个文件时,如下所示:
watcher.Path = filePath1;
Run Code Online (Sandbox Code Playgroud)
我收到错误:
The directory name C:\Cromos 3.0\repository\diagnostics\dwm01_2011_06_13__09_03.LXD is invalid.
Run Code Online (Sandbox Code Playgroud)
你能只设置文件夹目录的路径吗?
我想在网络服务器上观看文件夹树以进行更改.这些文件都有特定的扩展名.树中有大约200个文件夹,大约有1200个文件带有我正在观看的扩展名.
我无法写服务在服务器上运行(禁止!)所以解决方案必须是客户端的本地解决方案.及时性并不是特别重要.我可以在通知中花费一分钟或更长时间.我正在关注创建,删除,重命名和更改.
使用.NET System.IO.fileSystemWatcher会在服务器上创建大量负载吗?
10个单独的观察者如何减少正在观看的文件夹/文件的数量?(从700个文件夹中减去200个,从总共5500个文件减少到1200个)更多网络流量而不是更少?我的想法是在服务器上重新洗牌,将观看的文件放在1棵树下.我可能并不总是有这个选项,因此观察团队.
我认为另一个解决方案是定期检查FSW是否在服务器上造成过度负载,或者它是否适用于一大堆SysAdmin类型的原因.
有一个更好的方法吗?
当多个文件放入监视目录时,我遇到了FileSystemWatcher的问题.我想在文件放入目录后立即解析它.通常,第一个文件解析正常,但向目录添加第二个文件会导致访问问题.偶尔,第一个文件甚至不会解析.只有一个应用程序正在运行并正在查看此目录.最终,此进程将在多台计算机上运行,并且它们将监视共享目录,但只有一台服务器可以解析每个文件,因为数据已导入数据库且没有主键.
这是FileSystemWatcher代码:
public void Run() {
FileSystemWatcher watcher = new FileSystemWatcher("C:\\temp");
watcher.NotifyFilter = NotifyFilters.FileName;
watcher.Filter = "*.txt";
watcher.Created += new FileSystemEventHandler(OnChanged);
watcher.EnableRaisingEvents = true;
System.Threading.Thread.Sleep(System.Threading.Timeout.Infinite);
}
Run Code Online (Sandbox Code Playgroud)
然后是解析文件的方法:
private void OnChanged(object source, FileSystemEventArgs e) {
string line = null;
try {
using (FileStream fs = new FileStream(e.FullPath, FileMode.Open, FileAccess.Read, FileShare.None)) {
using (StreamReader sr = new StreamReader(fs)) {
while (sr.EndOfStream == false) {
line = sr.ReadLine();
//parse the line and insert into the database
}
}
}
}
catch (IOException ioe) …
Run Code Online (Sandbox Code Playgroud) 有没有办法确定FSW是否删除了文件或目录?
c# ×8
.net ×4
copy ×1
file ×1
file-access ×1
file-io ×1
inotify ×1
io ×1
linux ×1
monitoring ×1
performance ×1
winforms ×1