C# 监视包含大量子文件夹的文件夹上的更改?
我一直在开发一个,我一直在尝试实现的一个功能是最近活动的列表,即最近修改/创建的文件的列表 我知道我们确实有inotify。但是,它有两个局限性:C# 监视包含大量子文件夹的文件夹上的更改?,c#,c,filesystems,vala,C#,C,Filesystems,Vala,我一直在开发一个,我一直在尝试实现的一个功能是最近活动的列表,即最近修改/创建的文件的列表 我知道我们确实有inotify。但是,它有两个局限性: 它不监视子文件夹中的更改 一次最多可以查看的文件夹数 因此,我的方法如下:我遍历整个树结构,比较每个文件夹的修改日期。如果检测到某些变化,我会发出信号并停止。但是,为了避免在执行此搜索时冻结GUI,我必须在另一个线程中执行它 所以,我的指示器每3秒运行一次搜索。这对我来说很好。但是,一些用户在执行此搜索时指出了一个分段错误错误。在特定情况下,文件夹结
分段错误
错误。在特定情况下,文件夹结构有23k个文件和文件夹
有谁有更好的解决方案吗?提前谢谢大家
我把代码贴在下面
下面的代码每3秒执行一次,它会创建一个新线程,我在其中执行查找更改的操作
private async bool core () throws ThreadError {
// Do not create a new Thread if there is another
if (is_working == false) {
is_working = true;
SourceFunc callback = core.callback;
ThreadFunc<bool> run = () => {
File dir_root = File.new_for_path (path);
try {
FileInfo info = dir_root.query_info ("*", 0);
string iso = info.get_modification_time().to_iso8601();
GLib.DateTime file_modification_date = new GLib.DateTime.from_iso8601 (iso, null);
// Check if the root dir has changed
if (last_check_date.compare (file_modification_date) == -1) {
is_working = false;
// emitting change signal
changed (info);
} else {
compare_modification_date (path, last_check_date);
is_working = false;
}
last_check_date = new DateTime.now_local ();
Idle.add ((owned)callback);
return true;
} catch (Error e) {
print ("Error getting info: %s",e.message);
return false;
}
};
new Thread<bool>("compare-dir", run);
yield;
}
return true;
}
@BrootsWaymb,这是因为解决方案不需要在Vala中。但是好吧……我很困惑,看起来你确实想要vala/glib答案,那么为什么要使用c#/filesystem标签呢?不管怎样,听起来像是你想要的FileMonitor@ZanderBrown见我之前的评论。FileMonitor具有与inotify完全相同的限制。它不跟踪子文件夹上的更改,创建大量的子文件夹不是一个好主意。在某种程度上,你与内核抗争,仍然没有解释c#标记
private void compare_modification_date (string dir_path, GLib.DateTime d) {
File dir = File.new_for_path (dir_path);
//
try {
FileEnumerator files = dir.enumerate_children("*", FileQueryInfoFlags.NOFOLLOW_SYMLINKS, null);
FileInfo info = files.next_file (null);
while(info != null) {
if(info.get_file_type() == FileType.DIRECTORY && !info.get_name().has_prefix(".") ) {
string iso = info.get_modification_time().to_iso8601();
GLib.DateTime file_modification_date = new GLib.DateTime.from_iso8601 (iso, null);
if (d.compare(file_modification_date) == -1) {
print ("The dir %s has been modified.", info.get_name());
// emitting change signal
changed (info);
break;
} else {
compare_modification_date(dir_path+"/"+info.get_name(), d);
info =files.next_file (null);
}
} else {
info = files.next_file(null);
}
}
} catch (Error e) {
print ("Error comparing dates:%s", e.message);
}
}
}