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
相关产品推荐
相关产品推荐

