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

使用FileSystemWatcher遇“NoRename不在当前上下文”错误求助

问题解决:FileSystemWatcher Renamed事件编译错误

错误原因

  1. 语法错误:代码中*NoRename*的写法不符合C#语法,方法名不需要用星号包裹
  2. 未定义事件处理方法:当前代码上下文不存在名为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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 06:20:44