代码之家  ›  专栏  ›  技术社区  ›  user584018

如何同时观看大约100个文件夹?FileSystemWatcher还是其他更有效的选项?

  •  0
  • user584018  · 技术社区  · 4 年前
    • 我在一个驱动器下面有一个基本文件夹 Data 在这下面我有 文件夹。

    enter image description here

    • 在每个文件夹中 Folder1.....100 ,其中一个第三方应用程序推送zip文件(zip包含1个或多个文件)。

    • 一旦文件可用,我需要解压压缩文件,并将所有解压的文件放在第二个文件夹,这我需要为每个文件夹(文件夹1..)。。100)一旦文件可用。

    • 下面的代码建议我通过C# FileSystemWatcher ,我可以一次查看一个文件夹并执行该操作。

    问题是,如何并行监视100个文件夹?

     class ExampleAttributesChangedFiringTwice
    {
        public ExampleAttributesChangedFiringTwice(string demoFolderPath)
        {
            var watcher = new FileSystemWatcher()
            {
                Path = demoFolderPath,
                NotifyFilter = NotifyFilters.LastWrite,
                Filter = "*.txt"
            };
    
            watcher.Changed += OnChanged;
            watcher.EnableRaisingEvents = true;
        }
    
        private static void OnChanged(object source, FileSystemEventArgs e)
        {
            // extract zip file, do the validation, copy file into other destination
        }
    }
    

    目标文件夹是否与zip的源文件夹相同?也就是说,不管它是来自Folder1还是Folder2,都将被提取到FolderX?

    目标文件夹是所有“C:\ExtractedData”的公用文件夹。

    所以数据下的每个文件夹都会被监视?没有“黑名单”文件夹?如果zip出现在数据本身而不是它的子文件夹中呢?如果创建了一个新的子文件夹,应该也监视它吗?

    “zip”总是出现在“子文件夹”中,它永远不会在数据文件夹中创建。 是的,有一个机会在未来,更多的子文件夹将来,需要观看。

    例如,如果A.zip包含两个文件“1.txt”和“2.txt”,那么这两个文件都将转到“C:\ExtractedData”。这对于每个zip文件到达不同的子文件夹是很常见的。

    0 回复  |  直到 4 年前
        1
  •  3
  •   Martheen    4 年前

    “100个文件夹并行”的部分原来是一个红鲱鱼。因为所有新的zip文件无论在哪里显示都是一样的,所以只需添加 IncludeSubdirectories=true 够了。注意以下代码容易出现异常,请阅读注释

    class WatchAndExtract
    {
        string inputPath, targetPath;
        public WatchAndExtract(string inputPath, string targetPath)
        {
            this.inputPath = inputPath;
            this.targetPath = targetPath;
            var watcher = new FileSystemWatcher()
            {
                Path = inputPath,
                NotifyFilter = NotifyFilters.FileName,
                //add other filters if your 3rd party app don't immediately copy a new file, but instead create and write
                Filter = "*.zip",
                IncludeSubdirectories = true
            };
            watcher.Created += OnCreated; //use Changed if the file isn't immediately copied
            watcher.EnableRaisingEvents = true;
        }
    
        private void OnCreated(object source, FileSystemEventArgs e)
        {
            //add filters if you're using Changed instead 
            //https://stackoverflow.com/questions/1764809/filesystemwatcher-changed-event-is-raised-twice
            ZipFile.OpenRead(e.FullPath).ExtractToDirectory(targetPath);
            //this will throw exception if the zip file is being written.
            //Catch and add delay before retry, or watch for LastWrite event that already passed for a few seconds
        }
    }
    

    如果它跳过了一些文件,则一次创建的文件太多和/或zip太大,无法处理。或者 increase the buffer size 或者让他们进来 new thread . 在IO繁忙或zip文件非常大的HDD上,事件可能会超出存储容量,并且在长时间繁忙后会跳过文件,因此您必须考虑改为写入不同的物理驱动器(而不仅仅是同一设备中的不同分区)。始终验证预测的使用模式。