You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C#新手求助:FileSystemWatcher监控文件夹复制新TXT文件

解决你的C#文件夹监控与文件复制问题

嘿,作为C#新手你已经搭建了一个不错的基础框架啦!咱们一步步来梳理问题,把你的代码完善好~

先给你吃个定心丸:整体思路完全正确

你用FileSystemWatcher来监控文件夹的文件创建事件,这个选择非常合适——它就是.NET专门用来监听文件系统变化的组件,你的代码框架没毛病,只需要调整几个小细节就能正常工作。

核心问题:如何定义sourceFile变量

在OnCreated事件的参数FileSystemEventArgs e里,自带了新建文件的完整路径属性:e.FullPath,这正是你需要的sourceFile!所以直接把sourceFile赋值为这个属性就行。

另外还有个小细节:你代码里的watcher.Filter = "*.log";,但你说要监控.txt文件,记得把这里改成*.txt哦。

额外需要注意的坑:文件未完全写入就触发事件

FileSystemWatcher的Created事件会在文件刚被创建时就触发,但这时候文件可能还在被写入(比如其他程序正在往里面写内容),直接复制会报“文件被占用”的错误。所以我们可以加个简单的重试逻辑,确保文件能正常访问后再复制。

还有,要确保目标文件夹存在,如果目标路径不存在,File.Copy会报错,所以可以在复制前先创建目标路径。

修改后的完整代码

using System;
using System.IO;
using System.Threading;

namespace Folderwatch
{
    class Program
    {
        static void Main(string[] args)
        {
            string sourcePath = @"C:\Users\me\Documents\SomeFolder";
            FileSystemWatcher watcher = new FileSystemWatcher(sourcePath);
            
            watcher.EnableRaisingEvents = true;
            watcher.IncludeSubdirectories = true;
            watcher.Filter = "*.txt"; // 改成你需要监控的txt文件

            // 绑定创建事件
            watcher.Created += OnCreated;

            Console.WriteLine("正在监控文件夹:{0}", sourcePath);
            Console.WriteLine("按 'q' 退出程序。");
            while (Console.Read() != 'q') ;
        }

        private static void OnCreated(object source, FileSystemEventArgs e)
        {
            string destPath = @"C:\Users\pdeeb\Desktop\Temp";
            // 确保目标文件夹存在
            Directory.CreateDirectory(destPath);
            
            string sourceFile = e.FullPath; // 获取新建文件的完整路径
            string destFile = Path.Combine(destPath, Path.GetFileName(sourceFile)); // 只取原文件名拼接目标路径
            
            // 重试逻辑:处理文件被占用的情况
            int retryCount = 3;
            bool copiedSuccessfully = false;
            while (retryCount > 0 && !copiedSuccessfully)
            {
                try
                {
                    File.Copy(sourceFile, destFile, true); // true允许覆盖
                    Console.WriteLine("已复制文件:{0} -> {1}", sourceFile, destFile);
                    copiedSuccessfully = true;
                }
                catch (IOException)
                {
                    // 文件被占用,等待1秒后重试
                    Thread.Sleep(1000);
                    retryCount--;
                }
                catch (Exception ex)
                {
                    Console.WriteLine("复制文件出错:{0}", ex.Message);
                    break;
                }
            }

            if (!copiedSuccessfully)
            {
                Console.WriteLine("重试多次后仍无法复制文件:{0}", sourceFile);
            }
        }
    }
}

关键修改点说明

  • 把Filter改成了*.txt,匹配你需要监控的文件类型
  • sourceFile直接使用e.FullPath,获取新建文件的完整路径
  • 新增Directory.CreateDirectory(destPath),确保目标文件夹存在
  • 添加了重试逻辑,处理文件被占用的常见问题
  • 用Path.GetFileName(sourceFile)来获取原文件名,避免目标路径出现多余的层级

这样调整后,你的程序就能稳定地监控文件夹,复制新创建的txt文件到目标文件夹啦!

内容的提问来源于stack exchange,提问作者Stpete111

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.09 19:52:43