C# Systemfilewatcher未正确触发已删除事件

C# Systemfilewatcher未正确触发已删除事件,c#,wpf,C#,Wpf,我有一个filewatcher: private void initFileWatcherActive() { try { FileSystemWatcher watcher = new FileSystemWatcher(); watcher.Path = Global.Directory + Global.Machine + "\\" + Machines.Directories.Aktiv;

我有一个filewatcher:

private void initFileWatcherActive()
    {
        try
        {
            FileSystemWatcher watcher = new FileSystemWatcher();
            watcher.Path = Global.Directory + Global.Machine + "\\" + Machines.Directories.Aktiv;

            watcher.NotifyFilter = NotifyFilters.Attributes |
            NotifyFilters.CreationTime |
            NotifyFilters.DirectoryName |
            NotifyFilters.FileName |
            NotifyFilters.LastAccess |
            NotifyFilters.LastWrite;

            watcher.IncludeSubdirectories = false;
            watcher.Filter = "*.*";
            watcher.InternalBufferSize = 24000;


            watcher.Created -= new FileSystemEventHandler(OnChangedActive);
            watcher.Deleted -= new FileSystemEventHandler(OnChangedActive);

            watcher.Created += new FileSystemEventHandler(OnChangedActive);
            watcher.Deleted += new FileSystemEventHandler(OnChangedActive);
            watcher.EnableRaisingEvents = true;
        }
        catch (Exception ex)
        {
            setStatus("Filewatcher konnte nicht initialisiert werden: " + ex.Message, Level.ERROR);
        }
    }
通过此电话:

   private void OnChangedActive(object source, FileSystemEventArgs e)
    {
        try
        {
            switch (e.ChangeType)
            {
                case WatcherChangeTypes.Created: break;

                case WatcherChangeTypes.Deleted:



                    break;
                default:
                    break;
            }   
        }
        catch (Exception ex)
        {
            this.Dispatcher.BeginInvoke(new Action(() => setStatus(ex.Message, Level.ERROR)));
        }

    }
如果我在windows资源管理器中添加或删除文件,一切正常。 但在我的场景中,另一个.net程序使用以下代码添加该文件:

public static void add(String path, MachineOrder machineOrder, String fileExtention)
    {

        String filePath = path;
        StringBuilder stringBuilder = new StringBuilder();

        stringBuilder.AppendLine("Auftragsnummer;" + machineOrder.Ordernumber);
        stringBuilder.AppendLine("Positionsnummer;" + machineOrder.Positionnumber);
        stringBuilder.AppendLine("Aenderungsdatum;" + machineOrder.Editdate.ToString("yyyy-MM-dd hh:mm:ss"));
        stringBuilder.AppendLine("Menge;" + machineOrder.Amount.ToString());
        stringBuilder.AppendLine("Menge fertig;" + machineOrder.AmountReady.ToString());
        stringBuilder.AppendLine("Termin;" + machineOrder.Deliverydate.ToString("yyyy-MM-dd"));
        stringBuilder.AppendLine("Kundennummer;" + machineOrder.Customernumber);
        stringBuilder.AppendLine("Kundenname;" + machineOrder.Customername);
        stringBuilder.AppendLine("Kdauf.-nummer;" + machineOrder.CustomerOrdernumber);
        stringBuilder.AppendLine("Kdauf.-positionsnummer;" + machineOrder.CustomerOrdernumber);
        stringBuilder.AppendLine("Modell;" + machineOrder.Modell);


        foreach (KeyValuePair<String, string> characteristic in machineOrder.Charakteristics)
        {
            stringBuilder.AppendLine(characteristic.Key + ";" + characteristic.Value);
        }


        String filename = FilenameBuilder.buildFilename(machineOrder, fileExtention);

        filePath = filePath + "\\" + filename;
        System.IO.File.WriteAllText(filePath, stringBuilder.ToString());

    }
publicstaticvoidadd(字符串路径、MachineOrder、MachineOrder、字符串文件扩展名)
{
字符串filePath=path;
StringBuilder StringBuilder=新的StringBuilder();
stringBuilder.AppendLine(“Auftragsummer;”+机器订单.订单号);
stringBuilder.AppendLine(“定位器制造商;”+机器订单.定位器编号);
stringBuilder.AppendLine(“Aenderungsdatum;”+machineOrder.Editdate.ToString(“yyyy-MM-dd hh:MM:ss”);
stringBuilder.AppendLine(“Menge;”+machineOrder.Amount.ToString());
stringBuilder.AppendLine(“Menge fertig;”+machineOrder.amonReady.ToString());
stringBuilder.AppendLine(“term;”+machineOrder.Deliverydate.ToString(“yyyy-MM-dd”);
stringBuilder.AppendLine(“Kundennummer;”+machineOrder.Customernumber);
stringBuilder.AppendLine(“Kundenname;”+machineOrder.Customername);
stringBuilder.AppendLine(“Kdauf.-numer;”+machineOrder.CustomerOrdernumber);
stringBuilder.AppendLine(“Kdauf.-positionsnummer;”+机器订单.客户订单编号);
stringBuilder.AppendLine(“model;”+machineOrder.model);
foreach(机器订单特征中的键值对特征)
{
stringBuilder.AppendLine(characteristic.Key+“;”+characteristic.Value);
}
String filename=FilenameBuilder.buildFilename(机器顺序,文件扩展名);
filePath=filePath+“\\”+文件名;
System.IO.File.WriteAllText(文件路径,stringBuilder.ToString());
}
现在,filewatcher跳转到创建、删除、创建、删除等等。。我不知道为什么


有什么想法吗?

看起来您正在实例化多个
FileSystemWatcher
实例,可能是无意中

initFileWatcherActive
创建新实例,删除事件处理程序,并添加新处理程序。您试图从一个全新实例中删除处理程序的事实使我认为您多次调用此函数,可能是打算从现有实例中删除处理程序。这将导致多个观察者监视同一个目录,并使其看起来像事件发生了不止一次


您可能应该在更高的范围内声明一个监视程序,并且只实例化一次。

FilenameBuilder.buildFileFileName()的作用是什么?是否可能在尝试确定唯一文件名时创建和删除文件?filenamebuilder仅基于某些参数生成名称。它从不在文件系统中创建或删除任何内容。我会多次启动它。但是
Global.Machine
总是不同的