当前位置: 首页 > 知识库问答 >
问题:

C#: FileSystemWatcher-多个观看文件夹问题

马业
2023-03-14

我正在尝试用c#编写程序,它正在监视多个文件夹。若在任何关注的文件夹中添加了文件,程序应在定义的路径中创建副本。我的问题是当我创建文件时,程序在错误的文件夹中创建副本

e、 g.如果我将文件添加

 C:\folder1\stuff\ 
 D:\stuff1\copied1...3\
 D:\stuff2\copied1...3\

代码如下:

namespace Watcher
{
    public class Watcher
    {

        struct Paths
        {
            public string sourcePath;
            public List&ltstring> destinations;
            public FileSystemWatcher Watcher;
        }

        List&ltPaths> paths = new List&ltPaths>();

        public Watcher()
        {
            createWatchTower();
        }

        public void watch()
        {
            foreach (Paths p in paths)
            {
                p.Watcher.Created += (sender, e) => onCreate(sender, e, p.destinations);
            }
        }

        void createWatchTower()
        {
            Paths p1;
            p1.destinations = new List&ltstring>();

            p1.sourcePath = @"C:\folder1\stuff\";

            p1.Watcher = new FileSystemWatcher();
            p1.Watcher.Path = p1.sourcePath;
            p1.Watcher.EnableRaisingEvents = true;

            p1.destinations.Add(@"D:\stuff1\copied1\");
            p1.destinations.Add(@"D:\stuff1\copied2\");
            p1.destinations.Add(@"D:\stuff1\copied3\");
            paths.Add(p1);


            Paths p2;
            p2.destinations = new List&ltstring>();
            p2.sourcePath = @"C:\folder2\stuff2";

            p2.Watcher = new FileSystemWatcher();
            p2.Watcher.Path = p2.sourcePath;
            p2.Watcher.EnableRaisingEvents = true;

            p2.destinations.Add(@"D:\stuff2\copied1\");
            p2.destinations.Add(@"D:\stuff2\copied2\");
            p2.destinations.Add(@"D:\stuff2\copied3\");

            paths.Add(p2);

        }

        private void onCreate(object o, FileSystemEventArgs e, List&ltstring> dest)
        {

            foreach (string s in dest)
            {
                try
                {
                    System.IO.File.Copy(e.FullPath, s + e.Name, true);
                }
                catch (Exception ex)
                {
                    Console.WriteLine(ex);
                }
            }
        }
    }
}

有人能帮我吗?我想这是因为foreach事件,但我找不到解决办法。谢谢你的来信

共有3个答案

缑赤岩
2023-03-14

我有一个类似的程序作为windows服务运行。我创建了一个XML配置文件,其中包含要查看的所有文件夹,以及对应于每个路径的目标路径。然后,我有另一个观察线程为每个文件夹观看。

为了获得正确的输出路径,需要将其与正在监视的文件夹配对。因此,您可以使用配置文件,或者类似于字典或KeyValuePairs列表的内容。

曾嘉瑞
2023-03-14

您可以将路径创建为字典(sourcePath=

var dest = paths[((FileSystemWatcher)sender).Path].destinations
陈浩
2023-03-14

如果未使用C#5,则问题在于watch方法中foreach循环中的p上的闭包:

foreach (Paths p in paths)
{
    p.Watcher.Created += (sender, e) => onCreate(sender, e, p.destinations);
}

当在lambda中使用p时,它将捕获变量,而不是其值。因此,如果引发了Created事件,p将引用路径列表的最后一项。

您可以通过在Foreach循环中引入一个临时变量来避免这种情况:

foreach (Paths p in paths)
{
    var tmp = p;
    p.Watcher.Created += (sender, e) => onCreate(sender, e, tmp.destinations);
}

你可以在这个Stackoverflow问题中找到关于C#5中变化的更详细的分析

 类似资料:
  • 问题内容: 有没有办法使用以下方法订阅多个对象上的事件 例如 问题答案: 从AngularJS 1.3开始,有一个新方法称为观察一组表达式。

  • 我把这个要点用在我的文档中:https://gist.github.com/httpNick/708219f5002b6a9dc578 它对ES6 Babelfiying非常有效,但我想查看我的系统中的所有文件/public/js文件夹,并将生成版本输出到生成文件夹。有没有办法修改这个gulpfile来查看文件夹中的所有js文件? 从要点复制粘贴:

  • 本文向大家介绍Linux中查看指定文件夹内各个子文件夹内的文件数量,包括了Linux中查看指定文件夹内各个子文件夹内的文件数量的使用技巧和注意事项,需要的朋友参考一下 count脚本 执行 $ bash count.sh benchmark benchmark: 2317 benchmark/0: 20 benchmark/1: 891 benchmark/2: 65 benchmark/3: 1

  • 我正在使用Ubuntu,希望将一个包含图像的文件夹(30k图像)拆分为不同的文件夹。但是,我想对它们进行排序(而不仅仅是拆分成更小的子文件夹)。我有一个文件,其中包含图像的文件夹目标信息。该文件的结构如下: 123.jpg,1 124.jpg,2 125.jpg,3 这应该解释为:image 123.jpg到文件夹1,image 124.jpg到文件夹2,image 125.jpg到文件夹3。 在

  • 问题内容: 我正在尝试查看特定文件夹中的更改,然后,如果其中发生任何添加/修订/删除,则需要获取该文件夹及其子文件夹中所有文件的更改类型。我正在为此使用,但它仅监视单个路径,不处理子文件夹。 这是我的方法: 就像我之前说过的,我只获取所选路径中文件的日志,并且我想查看所有文件夹和子文件夹文件,例如: 范例1: 范例2: 有没有更好的解决方案? 问题答案: A 仅监视您注册的S。它不会递归地通过这些

  • //我得到的错误是java。尼奥。文件FileAlreadyExistsException所以据我所知,它试图将文件保存到确切的位置,而不是保存在文件中,如果我将目标地址改为“垃圾/垃圾”,我需要以这种方式保存几个文本文件。它将在那里保存一个名为垃圾的文件。txt。但在for-each的下一个循环中,它会抛出一个“已经存在”的异常。。。 有人能解释一下我如何从src文件夹将所有txt文件保存到该文