2016-11-20 1 views
0

bewegend war ich mit dem folgenden Code eine Datei in einen OrdnerDateisperre Fehler nach Dateien in Code

File.Move(Source,Dest); 

ich dann zu bewegen versuchen, die Datei, in der nächsten Methode zu öffnen und zu lesen, aber ich wurde immer Datei durch Prozessfehler gesperrt.

Also änderte ich die Datei Umzug in den folgenden Code

public async static Task<bool> MoveFileAsync(string sourceFileName, string destinationFileName) 
{ 
    using(FileStream sourceStream = File.Open(sourceFileName, FileMode.Open)) 
    { 
     using(FileStream destinationStream = File.Create(destinationFileName)) 
     { 
      try 
      { 
       await sourceStream.CopyToAsync(destinationStream); 
       File.Delete(sourceFileName); 
       return true; 
      } 
      catch 
      { 
       return false; 
      } 
     } 
    } 
} 

ich Fehler halte, dass die Datei

gesperrt

Alle Ideen, wie dies zu verhindern, geschieht.

Dies ist alles mit einem FileSystemWatcher, um den Ordner zu überwachen ... der Code ist unten. Ich kann bestätigen, dass keiner dieser Fehler auftritt, wenn ich Dateien in die Ordner ziehen und ablegen ... auch wenn ich mehrere Dateien ziehe ... using System; mit System.Collections.Generic; mit System.IO; mit System.Linq; mit System.Text; mit System.Threading.Tasks;

namespace DocumentManager.RepositoryService 
{ 
    internal class MonitorDropFolder 
    { 
     public string RepositoryPath { get; set; } 
     public FileSystemWatcher Watcher { get; set; } 

     public MonitorDropFolder() 
     { 
      Watcher = new FileSystemWatcher(); 
      Watcher.Path = @"c:\Repository\DropLocation"; 
      Watcher.NotifyFilter = NotifyFilters.FileName; 
      Watcher.Filter = "*.docx"; 
      Watcher.Created += new FileSystemEventHandler(OnCreatedHandler); 

      StartMonitoring(); 
     } 

     public void StartMonitoring() 
     { 
      Watcher.EnableRaisingEvents = true; 
     } 

     public void StopMonitoring() 
     { 
      Watcher.EnableRaisingEvents = false; 
     } 

     private void OnCreatedHandler(object source, FileSystemEventArgs e) 
     { 
      if(e.ChangeType == WatcherChangeTypes.Created) 
      { 
       //don't process temporary files 
       if (Path.GetFileName(e.FullPath).Substring(0, 1) == "~" || Path.GetFileName(e.FullPath).Substring(0, 1) == "$") 
        return; 


       var result = convert(e.FullPath, GetDocStatus(e.Name)).Result; 
       FileService.MoveNativeToDraft(e.FullPath); 
      } 
     } 

     private async Task<bool> convert(string fileName, string docStatus) 
     { 
      try 
      { 
       ConvertWordToPDF convertor = new ConvertWordToPDF(); 
       var task = Task.Run(()=>convertor.Convert(fileName, docStatus)); 
       await task; 


       return true; 
      } 
      catch (Exception) 
      { 
       return false; 
      } 
     } 
    } 
} 

Vielen Dank im Voraus

Update: ich den Code wie folgt nenne ...

public static void MoveIntoRepository(string sourceFile) 
{ 
    string destinationDir = @"C:\Repository\DropLocation\"; 
    var result = MoveFileAsync(sourceFile, Path.Combine(destinationDir, Path.GetFileName(sourceFile))).Result; 
} 

Ich versuchte auch, wie diese rund um die Dateisperre bekommen ...

bool isFileLocked = isLocked(filename); 
int numTries = 0; 
while(isFileLocked) 
{ 
    numTries++; 
    if (numTries > 100) 
     throw new Exception("FileLock Error"); 

    ///the following is actually in a called method 
    byte[] byteArray = File.ReadAllBytes(filename); 
    ///... rest of code here 

    Thread.Sleep(500); 
    isFileLocked = isLocked(filename); 
} 

, die diese Methode

aufruft 0
private static bool isLocked(string filename) 
{ 
    try 
    {   
     FileStream st = new FileStream(); 
     st = File.Open(filename,FileMode.Open); 
     st.Close(); 
     return false; 
    } 
    catch (Exception) 
    { 
     return true; 
     throw; 
    } 
} 
+0

Wenn Sie eine fsw verwenden Datei zu erkennen ändert es eine hohe Wahrscheinlichkeit, Sie versuchen, auf die Datei zuzugreifen, wenn das Betriebssystem oder ein anderes Programm benutzt es. File.Move sperrt die Datei nur während des Kopiervorgangs, und nur die Quelldatei des Ziels wird zum Lesen freigegeben. – Gusman

+0

Außerdem haben Sie den Code nicht gepostet, wenn Sie die MoveFileAsync-Funktion aufrufen, und das kann der Ort sein, an dem der Fehler liegt, fügen Sie ihn der Frage hinzu. – Gusman

Antwort

0

Siehe meine Kommentare unten in Code:

using(FileStream sourceStream = File.Open(sourceFileName, FileMode.Open)) 
{ 
    using(FileStream destinationStream = File.Create(destinationFileName)) 
    { 
     try 
     { 
      await sourceStream.CopyToAsync(destinationStream); 
      // The sourceFileName file is locked since you are inside the 
      // the using statement. Move statement for deleting file to 
      // outside the using. 
      File.Delete(sourceFileName); 
      return true; 
     } 
     catch 
     { 
      return false; 
     } 
    } 
} 
// Move it here