【问题标题】:FileSystemWatcher - Create and Rename C#FileSystemWatcher - 创建和重命名 C#
【发布时间】:2016-05-26 15:07:57
【问题描述】:

我目前正在开发一个 feeder 应用程序,该应用程序会查找添加的新文件并将其名称打印给我。但是当我创建一个新文件时,文件名会立即打印在控制台上。它不是等到我重命名新创建的文件。我该怎么做?

以下是我的设置。我没有使用watcher.Renamed+=OnRenamed,因为当我重命名文件夹中的任何其他文件时,它正在控制台上打印。但我的要求是只显示新创建的文件列表。

 watcher = new FileSystemWatcher(folderPath);
 watcher.IncludeSubdirectories = true;
 watcher.NotifyFilter = NotifyFilters.LastWrite | NotifyFilters.FileName;
 watcher.Filter = "*.*";
 watcher.Created += OnCreated;

TIA

【问题讨论】:

    标签: c# filesystemwatcher


    【解决方案1】:

    问题是(可能)您要进入 Windows 资源管理器,右键单击并选择新的 -> 文件类型。当您这样做时,Windows 会立即使用默认名称(如 New Text Document.txt)创建文件,并为您提供重命名的机会。此重命名与任何其他重命名没有区别,因此您有 2 个选项。

    1. 停止创建这样的文件,而是通过打开文本编辑器(或您使用的任何应用程序 word、excel 等)创建文件,在应用程序中创建一个新文件并使用正确的名称保存。这将使用您期望的名称创建文件。
    2. 更改代码以适应文件重命名。

    【讨论】:

    • 感谢 CamW :) 我认为 filewatcher 也会处理这种情况。因此尝试在文件夹本身中创建文件。
    • 是的,不幸的是,MS 决定以这种方式构建 Windows 资源管理器,而不是等到用户重命名文件后才在磁盘上实际创建它。
    • 嗨,凸轮。我还有一个疑问。将一组文档移动到文件夹时遇到问题。例如:当我将大约 30 个文档插入/移动到运行 filewatcher 的文件夹时,打印时它没有显示所有文件名。但是当我保持一个断点时,它就可以工作了。这有什么问题吗?
    • @ASN,我从来没有遇到过 FileSystemWatcher 没有“看到”所做更改的问题。我需要查看您在运行应用程序时看到的代码和输出。请创建一个新问题,列出您的代码、复制文件时的控制台输出和使用断点复制时的控制台输出,我会看看。如果您愿意,可以在此处发布问题的链接。
    【解决方案2】:

    由于 Windows 中的文件资源管理器如何处理新文件的创建(例如,通过 New->Text Document 快捷方式),您需要注意重命名。

    您可以通过HashSet<string> 对象跟踪添加文件的完整路径,并更改您的监控逻辑如下:

    当一个文件创建时,检查它的大小。你可以使用FileInfo.Length 来做到这一点。如果它是零字节,则忽略该事件。否则,将其添加到HashSet(重复项将被自动忽略)。

    当文件被重命名时,检查旧的完整路径和名称并将其从HashSet 中删除(如果存在);将新的完整路径和名称添加到 HashSet,无论大小。

    这应该会捕获所有新文件并忽略“新文本文档”样式对象。

    【讨论】:

      猜你喜欢
      • 2023-01-24
      • 1970-01-01
      • 2018-08-21
      • 1970-01-01
      • 2018-12-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多