我被要求找到一种方法来监视公司共享文件服务器(简单的Windows共享目录)上特定文件夹中文件的更改(修改,重命名,删除,移动).我在C#中编写了一个简单的应用程序,它使用FileSystemWatcher监视这些更改并通知它们的特定电子邮件地址.
我现在想知道的是如何找出进行这些更改的用户/计算机的名称/ IP.有任何想法吗?
作为编写自己的软件的替代方案,是否有任何支持此功能的好(可能是免费的)软件?
我即将实现原型FileSystemWatcher解决方案.我有一个目录来监控文件创建,以及吸收创建的文件并将其插入数据库的任务.大致这将涉及读取和处理6或7,80个字符文本文件,每隔几秒发生一次150毫秒的爆发,并且很少还需要处理2MB二进制文件.这很可能是一个24/7的过程.
从我读到的有关FileSystemWatcher对象的内容来看,最好将其事件排入一个线程,然后在另一个线程中将它们出列/处理.我现在遇到的困境是进行处理的线程的更好的创建机制.我能看到的选择是:
每次我收到FSW事件时,我都会手动创建一个新线程(是的,我知道......愚蠢的架构,但我必须说出来).
每当我收到FSW事件时,都会在CLR线程池中抛出处理
在启动时,为处理创建专用的第二个线程,并使用生产者/消费者模型来处理工作.主线程将请求排队,第二个线程将其排队并执行工作.
我倾向于将第三种方法作为首选方法,因为我知道工作线程将始终是必需的 - 而且可能更多因为我对线程池没有感觉.
我正在寻找一种可靠的方法来查找目录中的更改.
我尝试过使用FileSystemWatcher,但是当创建,更改或删除许多小文件时,它是相当不准确的.它错过了我测试中大约1%或2%的文件.当您快速添加或更改数千个文件时,这是非常重要的.
我已尝试以500毫秒,2000毫秒等不同时间间隔进行轮询更改.在这种情况下,我获得了太多的点击.这可能与FileInfo对象上的时间戳分辨率有关.
所以我的问题是; 是否可以使用.NET Framework可靠地获取对目录的更改?
- 基督徒
我想编写一个OSX(Snow Leopard)应用程序,它可以在特定目录中的文件发生更改时接收通知,并且我希望访问已更改的特定文件的路径.
我知道我可以用做这一点File System Events还是kqueue.前者没有提供更改哪个特定文件的详细信息(要求我构建我正在观看的目录的快照,然后扫描它以找出更改的文件).后者不支持递归观看(要求我以递归方式将监视添加到父目录中的每个文件和目录).
我已经找到了可以为我处理快照/递归乐趣的库,但找不到任何库.UKKQueue对于低级别的kqueue东西看起来像是一个很好的包装器,但似乎没有做递归.同样的GTMFileSystemKQueue.SCEvents看起来像一个很好的包装,File System Events但似乎没有找到更改的特定文件.
是否有一个库可以满足我的要求并且适合这些技术的objc项目?
我目前正在尝试使用FileSystemWatcher类排除目录,尽管我已经使用过:
FileWatcher.Filter = "C:\\$Recycle.Bin";
Run Code Online (Sandbox Code Playgroud)
和
FileWatcher.Filter = "$Recycle.Bin";
Run Code Online (Sandbox Code Playgroud)
编译好了,但是当我尝试这个时没有显示结果.
如果我取出过滤器,所有文件加载正常,代码如下:
static void Main(string[] args)
{
string DirPath = "C:\\";
FileSystemWatcher FileWatcher = new FileSystemWatcher(DirPath);
FileWatcher.IncludeSubdirectories = true;
FileWatcher.Filter = "*.exe";
// FileWatcher.Filter = "C:\\$Recycle.Bin";
// FileWatcher.Changed += new FileSystemEventHandler(FileWatcher_Changed);
FileWatcher.Created += new FileSystemEventHandler(FileWatcher_Created);
// FileWatcher.Deleted += new FileSystemEventHandler(FileWatcher_Deleted);
// FileWatcher.Renamed += new RenamedEventHandler(FileWatcher_Renamed);
FileWatcher.EnableRaisingEvents = true;
Console.ReadKey();
}
Run Code Online (Sandbox Code Playgroud) 我正在使用FileSystemWatcher扫描从Web应用程序上载文件的文件夹.我有超过1000个文件上传到该文件夹.现在,问题是FileSystemWatcher在复制第一个文件时启动,有时,它不适用于所有文件.任何建议都会非常值得一提.
我在Visual Studio 2010中使用C#和框架4.0.
在我的项目中,有两种不同的形式,有两个FileSystemWatchers属性EnableRaisingEvent设置为false.如果我关闭Visual Studio,当我重新打开它时,我会将FileSystemWatcher属性EnableRaisingEvent设置为true.
在设计器文件中的两个表单中都有以下代码:
private void InitializeComponent()
{
this.components = new System.ComponentModel.Container();
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(Form1));
this.fileSystemWatcher1 = new System.IO.FileSystemWatcher();
((System.ComponentModel.ISupportInitialize)(this.fileSystemWatcher1)).BeginInit();
this.SuspendLayout();
this.fileSystemWatcher1.Filter = "my_filter";
this.fileSystemWatcher1.NotifyFilter = System.IO.NotifyFilters.LastWrite;
this.fileSystemWatcher1.SynchronizingObject = this;
this.fileSystemWatcher1.Changed += new System.IO.FileSystemEventHandler(this.fileSystemWatcher1_Changed);
}
Run Code Online (Sandbox Code Playgroud)
该属性EnableRaisingEvent未设置,但默认值为false.
知道为什么我会得到这种奇怪的行为吗?
编辑
我按照Virtlink的建议,添加了以下代码:
this.fileSystemWatcher1.EnableRaisingEvents = false;
Run Code Online (Sandbox Code Playgroud)
它似乎解决了我的问题,但几天后(以及一些开放,关闭和重建项目,但没有修改fileSystemWatcher1)我发现:
在设计师,在属性fileSystemWatcher1,EnableRaisingEvents被设置回来true
在代码中,先前添加的行丢失了
我尝试转移到Visual Studio 2012(仍然是框架4.0),并且解决方法将问题解决了几天.然后我得到了与VS10相同的情况.
还有其他想法吗?
我有个问题.我编写了一个包装器FileSystemWatcher来检测根文件夹及其所有子文件夹中的更改.没有什么花哨:
FileSystemWatcher watcher = new FileSystemWatcher ();
watcher.Path = this.Root;
watcher.IncludeSubdirectories = true;
watcher.NotifyFilter = NotifyFilters.LastWrite | NotifyFilters.LastAccess | NotifyFilters.DirectoryName | NotifyFilters.FileName;
watcher.Changed += new FileSystemEventHandler (watcher_Changed);
watcher.Deleted += new FileSystemEventHandler (watcher_Deleted);
watcher.Created += new FileSystemEventHandler (watcher_Created);
watcher.Renamed += new RenamedEventHandler (watcher_Renamed);
watcher.EnableRaisingEvents = true;
Run Code Online (Sandbox Code Playgroud)
在.NET中,在Windows下,它就像一个魅力.但是当我将代码移植到mono并在OSX下运行代码时,它只能在根文件夹中正常工作.
我现在注意到的问题:
在观察者启动时,在根目录下已存在的文件夹内的操作不会引发事件
我通过EventArgs.FullPath属性获得的路径不正确(当我将文件复制到path_to_root/some/more/subdirs/some.file时,我获得的路径只是path_to_root/some.file).
一年前已经报道了unproper路径的问题(看起来已经解决了)但我的单声道来自去年12月(MonoDevelop在参考资料部分说它是版本4.0.0.0,我可以说有关分发)并且bug仍然存在...请参阅:https: //bugzilla.xamarin.com/show_bug.cgi?id = 5747
有任何想法吗?我真的很好奇,如果有一个解决方法,不需要编写自己的观察者,重复轮询文件系统或为根目录下的每个文件夹启动单独的观察者...
提前致谢!
可以使用跟踪某些事件,例如文件,文件夹的创建,删除或重命名FileSystemWatcher,但是我也需要跟踪复制和粘贴。
我不想跟踪从.text .doc等文件复制的内容,我想跟踪整个文件或文件夹(例如d:\folder\movies复制到)的内容e:\movies。下面的代码示例将能够保留任何文件操作(如重命名,删除,创建,更改)的日志。Iam寻找复制/粘贴并移动文件。
class Program
{
static void Main(string[] args)
{
DriveInfo[] allDrives = DriveInfo.GetDrives();
ArrayList list = new ArrayList();
String s;
foreach (DriveInfo d in allDrives)
{
if (DriveType.Fixed == d.DriveType)
{
s = Convert.ToString(d);
list.Add(s);
Console.WriteLine(s.TrimEnd());
}
}
run(list);
}
[PermissionSet(SecurityAction.Demand, Name = "FullTrust")]
public static void run(ArrayList list)
{
ArrayList fw = new ArrayList();
FileSystemWatcher Clientwatcher = new FileSystemWatcher();
foreach (string s in list)
{
String temp=s;
temp=temp+'\\';
Clientwatcher.Path =temp;
Clientwatcher.Filter …Run Code Online (Sandbox Code Playgroud) 答案如下.我既不能删除这个问题,也不能接受我的答案.
我正在FileSystemWatcher听一个文件夹.当我尝试重命名这个文件夹(在Windows资源管理器中)时,我得到一个
无法完成操作,因为文件夹或其中的文件在另一个程序中打开
错误.
评论这些FileSystemWatcher电话可以解决这个问题.
我尝试用一个简单的程序重现错误,但没有成功,所以我不确定这里发生了什么.有没有人遇到过这样的事情FileSystemWatcher?如果是这样 - 可能是什么导致了它?
更多信息:
以下似乎足以导致错误:
FileSystemWatcher fsw = new FileSystemWatcher(path);
fsw.Deleted += new FileSystemEventHandler(fsw_Deleted);
fsw.EnableRaisingEvents = true;
Run Code Online (Sandbox Code Playgroud)
我可以重命名该文件夹中的文件.和兄弟文件.我甚至试过把一个return;作为第一行fsw_Deleted.仍然没有奏效.由于没有关闭Visual Studio,并删除obj和bin,并再次运行.我甚至尝试不在VS中运行exe文件.仍然 - 没有锁定,如果它没有运行,如果它是锁定.
c# ×9
.net ×4
asynchronous ×1
clipboard ×1
file ×1
fsevents ×1
kqueue ×1
macos ×1
monitor ×1
mono ×1
objective-c ×1
polling ×1
threadpool ×1
windows ×1
winforms ×1