2015-12-09 26 views
0

我有一個filewatcher:Systemfilewatcher火災刪除事件不能正確

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 PROGRAMM添加文件與此代碼:

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()); 

    } 

現在filewatcher跳進創建,刪除,創建,刪除等..我不知道爲什麼

有任何想法嗎?

+0

'FilenameBuilder.buildFilename()'做了什麼?在嘗試確定唯一的文件名時,是否有可能創建和刪除文件? – pstrjds

+0

filenamebuilder只根據一些參數建立一個名稱。它從不創建或刪除文件系統 –

回答

0

看起來您正在實例化多個FileSystemWatcher實例,可能是無意中的。

initFileWatcherActive創建一個新的實例,刪除事件處理程序,並添加新的處理程序。事實上,你試圖從一個全新的實例中刪除處理程序讓我覺得你多次調用這個函數,可能是想從現有的實例中刪除處理程序。這將導致多個觀察者觀看相同的目錄並使其看起來像事件不止一次發生。

您應該聲明一個單獨的觀察者,在更高的範圍內,並且只實例化一次。

+0

中的任何內容,我多次啓動它。但'Global.Machine'總是不同的 –