0

Datei kommt über EDI als .today. Ich muss es in .txt ändern und es in einen anderen Ordner verschieben. Alles funktioniert gut für etwa 3-5 Dateien und beginnt dann mit dem Auslösen von Ausnahmen. Ich habe versucht, diese zu handhaben, aber das löst das Problem nicht. Ich bekomme auch sporadisch (Dateiname kann nicht null sein) Ausnahmen. Ich kann es einfach nicht herausfinden.FileSystemWatcher arbeitet 3-5 mal vor dem Auslösen von Ausnahmen - C#

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using System.IO; 
using System.Diagnostics; 
using System.Threading; 
using System.Windows.Forms; 
using System.Security.Permissions; 

namespace FileConverterService 
{ 


    class ConverterService 
    { 



     //Configure watcher & input 
     private FileSystemWatcher _watcher; 

     public bool Start() 
     { 
      _watcher = new FileSystemWatcher(@"C:\FTP_base\temp", "*.today"); 

      _watcher.Created += new FileSystemEventHandler(FileCreated); 

      _watcher.IncludeSubdirectories = false; 

      _watcher.EnableRaisingEvents = true; 

      return true; 
     } 




     //Configure output creation and append file name to include .txt extension 
     [PermissionSet(SecurityAction.Demand, Name = "FullTrust")] 
     private void FileCreated(object sender, FileSystemEventArgs e) 
     { 
      try 
      { 
       string dateTime = DateTime.Now.ToString("yyyyMMddHHmmssfff"); 
       string content = File.ReadAllText(e.FullPath); 
       string upperContent = content.ToUpperInvariant(); 
       var dir = Path.GetDirectoryName(e.FullPath); 
       var convertedFileName = Path.GetFileName(e.FullPath) + dateTime + ".txt"; 
       var convertedPath = Path.Combine(dir, convertedFileName); 

       File.WriteAllText(convertedPath, upperContent); 


      } 
      catch (IOException f) 
      { 
       if (f is IOException) 
       { 
        MessageBox.Show("Exception Caught"); //was just testing 
       } 
      } 

      MoveConvert(); 
     } 

     //Move converted file to EDI processing folder 
     public static void MoveConvert() 
     { 
      try { 
      string dateTime = DateTime.Now.ToString("yyyyMMddHHmmssfff"); 
      string rootFolderPath = @"C:\FTP_base\temp\"; 
      string moveTo = @"C:\FTP_base\INbound\inbound_" + dateTime + ".txt"; 
      //string moveTo = @"F:\FTP_base\Office Depot\INbound\inbound_" + dateTime + ".txt"; 
      string filesToMove = @"*.txt"; // Only move .txt 

      string myfile2 = System.IO.Directory.GetFiles(rootFolderPath, filesToMove).FirstOrDefault(); 
      string fileToMove = myfile2; 

      //moving file 
      File.Move(fileToMove, moveTo); 


       MoveOriginal(); 

      } 
      catch (IOException e) 
      { 
       if (e is IOException) 
       { 
        MessageBox.Show("File already exists."); //was just testing 
       } 
      } 
     } 


     public static void MoveOriginal() 
     { 
      try { 
      string dateTime = DateTime.Now.ToString("yyyyMMddHHmmssfff"); 
      string rootFolderPath2 = @"C:\FTP_base\temp\"; 
      string moveTo2 = @"C:\FTP_base\archive\archive_" + dateTime + ".archive"; 
      //string moveTo2 = @"F:\Xcelerator_EDI\OfficeDepot\DataFiles\Inbound\Archive2\archive_" + dateTime + ".archive"; 
      string filesToMove2 = @"*.today"; // Only move .today 


      string myfile = System.IO.Directory.GetFiles(rootFolderPath2, filesToMove2).FirstOrDefault(); 
      //foreach (string file in fileList) 

      string fileToMove2 = myfile; 

      //moving file 
      File.Move(fileToMove2, moveTo2); 

      } 
      catch (IOException e) 
      { 
       if (e is IOException) 
       { 
        MessageBox.Show("IO Exception Occurred"); //was just testing 
       } 
      } 
     } 



     //Stop Service control 
     public bool Stop() 
     { 
      _watcher.Dispose(); 

      return true; 
     } 
    } 
} 
+0

Manchmal funktioniert es nur einmal vor dem Werfen von Ausnahmen, manchmal 5 oder 6 in einer Reihe vor dem Werfen. Sehr merkwürdig. – Derek

+0

in welcher Zeile passiert das? –

+0

'FileSystemWatcher' ist notorisch schwierig zu verwenden, weil es viele Fehlerzustände hat. Wenn Sie für die Verwendung von Rx offen sind und sich nicht um Code kümmern, der von einem anderen Fulfillment-Unternehmen erstellt wurde, habe ich [einen Wrapper] (https://idcomlog.codeplex.com/SourceControl/latest#IdComLog.Reactive/FileSystem.cs) (Auch auf [NuGet] (https://www.nuget.org/packages/IdComLog.Reactive/)) habe ich erstellt, um es sehr viel zuverlässiger zu machen. –

Antwort

0

Vielleicht werden die Dateien noch verwendet. Das FileSystemWatcher-Ereignis wird ausgelöst, wenn eine Datei erstellt wird, aber der Erstellungsprozess kann immer noch darauf schreiben. Eine mögliche Lösung finden Sie unter here.

+0

Vielen Dank für Ihre Zeit! Ich werde weiter forschen – Derek