Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 监视包含大量子文件夹的文件夹上的更改?_C#_C_Filesystems_Vala - Fatal编程技术网

C# 监视包含大量子文件夹的文件夹上的更改?

C# 监视包含大量子文件夹的文件夹上的更改?,c#,c,filesystems,vala,C#,C,Filesystems,Vala,我一直在开发一个,我一直在尝试实现的一个功能是最近活动的列表,即最近修改/创建的文件的列表 我知道我们确实有inotify。但是,它有两个局限性: 它不监视子文件夹中的更改 一次最多可以查看的文件夹数 因此,我的方法如下:我遍历整个树结构,比较每个文件夹的修改日期。如果检测到某些变化,我会发出信号并停止。但是,为了避免在执行此搜索时冻结GUI,我必须在另一个线程中执行它 所以,我的指示器每3秒运行一次搜索。这对我来说很好。但是,一些用户在执行此搜索时指出了一个分段错误错误。在特定情况下,文件夹结

我一直在开发一个,我一直在尝试实现的一个功能是最近活动的列表,即最近修改/创建的文件的列表

我知道我们确实有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);
                }
         }
    
    }