我有此代码被重复3次:

private static void convert(object source, FileSystemEventArgs f)
{
    string FileName;
    FileName = f.FullPath;

    string destinationFile = @"Y:\test\test.xml";
              System.Threading.Thread.Sleep(2000);
   try
   {

        Encoding utf8 = new UTF8Encoding(false);
        Encoding ansi = Encoding.GetEncoding(1256);
        System.Threading.Thread.Sleep(2000);

        string xml = File.ReadAllText(FileName, ansi);
       XDocument xmlDoc = XDocument.Parse(xml);
            **Console.WriteLine("1st");**
            File.WriteAllText(
               destinationFile,
                @"<?xml version=""1.0"" encoding=""utf-8""?>" + xmlDoc.ToString(),
               utf8
            );
    }


选中以上粗体字。它写了3次。我刚刚进行了测试。但是为什么它要写3次。。意味着要写的文件也要写3次。

我正在从filesystemwatcher函数调用此函数,以监视文件夹是否已更改,然后将文件转换为utf-8并将其放入目标文件中。

编辑1:
这是我的观察者。您能检查一下是否可以:

private static void WatchFile()
    {
                watcher.Path = @"C:\project";

                   watcher.NotifyFilter = NotifyFilters.LastWrite;
        watcher.Filter = "*.xml";


        watcher.Changed += new FileSystemEventHandler(convert);
        watcher.Error += new ErrorEventHandler(WatcherError);
        Console.WriteLine("2nd");
        watcher.EnableRaisingEvents = true;


    }


仍然不知道为什么它会重复3次。

编辑2:

这是我的完整代码:

using System;
using System.IO;
using System.Text;
using System.Xml;
using System.Xml.Linq;
using System.Collections.Generic;
using System.Linq;





class Test
{
 class Class1
{
    private static FileSystemWatcher watcher =
       new FileSystemWatcher();

    public static void Main()
    {
        WatchFile();
      Console.ReadLine();
     }

    private static void WatchFile()
    {
        watcher.Path = @"C:\project";

                    watcher.NotifyFilter = NotifyFilters.LastWrite;
        watcher.Filter = "*.xml";


        watcher.Changed += new FileSystemEventHandler(convert);
        watcher.Error += new ErrorEventHandler(WatcherError);
        Console.WriteLine("2nd");
        watcher.EnableRaisingEvents = true;

    }

    public static string CrL = "\r\n";

    private static void convert(object source, FileSystemEventArgs f)
    {
        string FileName;
        FileName = f.FullPath;

               string destinationFile = @"Y:\test\OnAirNow.xml";

                 System.Threading.Thread.Sleep(2000);
       try
       {

            Encoding utf8 = new UTF8Encoding(false);
            Encoding ansi = Encoding.GetEncoding(1256);
            System.Threading.Thread.Sleep(2000);

            string xml = File.ReadAllText(FileName, ansi);
           XDocument xmlDoc = XDocument.Parse(xml);
                Console.WriteLine("1st");
                File.WriteAllText(
                   destinationFile,
                    @"<?xml version=""1.0"" encoding=""utf-8""?>" + xmlDoc.ToString(),
                   utf8
                );



        }
        catch (Exception e)
        {
            Console.WriteLine("The process failed: {0}", e.ToString());
        }


    }

    private static void WatcherError(object source, ErrorEventArgs e)
    {

        Exception watchException = e.GetException();
                   watcher = new FileSystemWatcher();
        while (!watcher.EnableRaisingEvents)
        {
            try
            {
                                   WatchFile();
                Console.WriteLine("I'm Back!!");
            }
            catch
            {
                                    System.Threading.Thread.Sleep(2000);
            }
        }
    }


  }
 }

最佳答案

使用FileSystemWatcher的常见模式是在开始处理事件时将EnableRaisingEvents设置为false

this.fileSystemWatcher = new FileSystemWatcher()
{
    Path = AppDomain.CurrentDomain.SetupInformation.ApplicationBase,
    NotifyFilter = NotifyFilters.LastWrite,
    Filter = Path.GetFileName(AppDomain.CurrentDomain.SetupInformation.ConfigurationFile)
};

this.fileSystemWatcher.Changed += this.ConfigChanged;
this.fileSystemWatcher.EnableRaisingEvents = true;




public void ConfigChanged(object sender, FileSystemEventArgs e)
{
    try
    {
        this.fileSystemWatcher.EnableRaisingEvents = false;
        s_logger.Info("Configuration file changed.");
        // reload config here
        s_logger.Info("Configuration settings reloaded.");
    }
    catch (Exception exception)
    {
        s_logger.Error(exception.Message);
        s_logger.Error("Failed to reload configuration settings.");
    }
    finally
    {
        this.fileSystemWatcher.EnableRaisingEvents = true;
    }
}

10-06 12:21