使用FileSystemWatcher遇“NoRename不在当前上下文”错误求助
问题解决:FileSystemWatcher Renamed事件编译错误
错误原因
- 语法错误:代码中
*NoRename*的写法不符合C#语法,方法名不需要用星号包裹 - 未定义事件处理方法:当前代码上下文不存在名为
NoRename的、符合RenamedEventHandler委托签名的方法
解决方案
步骤1:修正事件绑定的语法错误
移除方法名两侧的星号,正确的事件绑定写法应为:
watcher.Renamed += new RenamedEventHandler(NoRename); // 或者简化写法(C# 2.0+支持) watcher.Renamed += NoRename;
步骤2:定义对应的Renamed事件处理方法
在Program类中添加静态方法NoRename,其签名必须匹配RenamedEventHandler委托(返回void,参数为object和RenamedEventArgs):
static void NoRename(object sender, RenamedEventArgs e) { // 在这里编写文件重命名后的处理逻辑 // 例如:判断是否是从.FilePart后缀重命名为最终文件名 if (e.OldName.EndsWith(".FilePart")) { // 处理完成的文件,比如移动到目标服务器 Console.WriteLine($"文件已完成传输:{e.FullPath}"); // 这里添加你的SFTP/文件移动逻辑 } }
完整修正后的代码片段
using System; using System.IO; using Renci.SshNet; using Renci.SshNet.Sftp; namespace Hotfolder1 { class Program { static void Main() { string HFBase = @"c:\FTP"; FileSystemWatcher watcher = new FileSystemWatcher(HFBase); watcher.IncludeSubdirectories = true; watcher.NotifyFilter = NotifyFilters.FileName | NotifyFilters.LastWrite; watcher.Created += FileCreated; watcher.Renamed += NoRename; watcher.EnableRaisingEvents = true; // 保持程序运行,例如等待输入 Console.WriteLine("热文件夹监控已启动,按任意键退出..."); Console.ReadKey(); } static void FileCreated(object sender, FileSystemEventArgs e) { // 原有的文件创建事件处理逻辑 } static void NoRename(object sender, RenamedEventArgs e) { // 重命名事件处理逻辑 if (e.OldName.EndsWith(".FilePart")) { Console.WriteLine($"检测到完成传输的文件:{e.FullPath}"); // 在这里实现将文件移动到另一服务器的逻辑 using (var client = new SftpClient("目标服务器IP", "用户名", "密码")) { client.Connect(); client.UploadFile(File.OpenRead(e.FullPath), "/目标路径/" + e.Name); client.Disconnect(); // 上传完成后可以删除本地文件或做其他处理 File.Delete(e.FullPath); } } } } }
额外注意事项
- 确保
FileCreated方法也已在类中定义,否则会出现类似的编译错误 - 处理文件操作时要注意线程安全,因为
FileSystemWatcher的事件是在后台线程触发的 - 对于大文件,建议在处理前验证文件是否已完全写入(例如检查文件大小是否稳定)
内容的提问来源于stack exchange,提问作者twbass
相关产品推荐
相关产品推荐

