2016-07-26 5 views
2

Ich habe ein Problem mit einer Dateiaktualisierung Teil eines ASP.NET MVC-Programms, an dem ich arbeite. Die Grundvoraussetzung ist, dass das Programm ein bearbeitetes Bild vom Benutzer aufnimmt und dann die alte Datei mit den neuen Daten aktualisiert, wobei der alte Name beibehalten wird. Wenn die Datei jedoch aus dem temporären Ordner in den Ordner verschoben wird, in dem sie gespeichert werden soll, wird sie als neue Datei gespeichert, während die alte beibehalten wird. (Zum Beispiel existieren "foo 1-1.jpg" und "foo 1-1.jpg" im selben Ordner). Soweit ich das beurteilen kann, sind die beiden Dateinamen identisch. Warum passiert das und wie mache ich es so, dass es die alte Datei zuerst wie beabsichtigt löscht?Programm speichert eine Datei, aber löscht nicht alte Datei mit dem gleichen Namen

Ich bekomme den alten Dateinamen vor dem Verschieben, also sollte es dort kein Problem geben. Es gibt auch keine Pfadprobleme.

Ich bin mir nicht sicher, ob ein Problem mit dem übergebenen Pfad vorliegt, aber ich verwende dieselbe Methode, um den Dateipfad zu verschieben. Daher weiß ich nicht, warum FileDelete fehlschlagen würde() und nicht File.Move(). Hier

ist der Code in Frage:

/// <summary> 
    /// Move a number of files to a single directory, keeping their names 
    /// and overwriting if the switch is toggled. 
    /// Will ignore nonexistent files, and return false if the specified directory does not exist. 
    /// Returns true if it succeeded, false if it did not. 
    /// </summary> 
    /// <param name="filePaths">An array of filepath strings, </param> 
    /// <param name="saveDirectory">The path to the directory to use</param> 
    /// <param name="overWrite">Optional, defaults to false. Whether or not 
    /// to overwrite any existing files with the same name in the new directory. 
    /// If false, skips files that already exist in destination.</param> 
    /// <returns>bool</returns> 
    public static bool MoveSpecificFiles(string[] filePaths, string saveDirectory, bool overWrite = false) 
    { 
     //If the directory doesn't exist, error out. 
     if (!Directory.Exists(saveDirectory)) 
     { 
      return false; 
     } 
     string fileName; 

     try 
     { 
      foreach (string filePath in filePaths) 
      { 
       //Check if the file to be moved exists. If it doesn't, skip it and go to the next one. 
       if (File.Exists(filePath)) 
       { 
        fileName = Path.GetFileName(filePath); 

        //if the overwrite flag is set to true and the file exists in the new directory, delete it. 
        if (overWrite && File.Exists(saveDirectory + fileName)) 
        { 
         //WHERE THE ERROR IS OCCURING 
         File.Delete(saveDirectory + fileName); 
        } 
        //If the file to be moved does not exist in the new location, move it there. 
        //This means that duplicate files will not be moved. 
        if (!File.Exists(saveDirectory + fileName)) 
        { 
         File.Move(filePath, saveDirectory + fileName); 
        } 
       } 
       //throw new ArgumentException(); 
      } 
     } 
     catch (Exception) 
     { 
      //check = saveDirectory + " " + Path.GetFileName(filePaths[0]); 
      return false; 
     } 
     return true; 
    } 

Jede Hilfe wäre sehr willkommen.

+0

Was ist die Fehlermeldung, die Sie bekommen? – Shyju

+0

Keine spezifische Fehlermeldung, nur unbeabsichtigtes Verhalten. File.Delete findet die angegebene Datei nicht, und es kann gefolgert werden, dass keine Ausnahme erzeugt wird, weil das Bild verschoben wird. Das Problem ist, dass es die alte Datei finden sollte, weil ich in einer früheren Methode den Namen der alten Datei ergreife, um sie an diese Datei weiterzugeben. –

+0

Sind Sie sicher, dass der Wert der 'overWrite'-Variable wahr ist? – Shyju

Antwort

1

Die einzige Verbesserung, die ich vorschlagen kann, ist die Path.Combine Methode zu verwenden, um den richtigen Pfad zu erzeugen. Bei dieser Methode müssen Sie nicht kümmern misssing / am Ende usw.

var fullPath = Path.Combine(saveDirectory, fileName); 
if (overWrite && File.Exists(fullPath)) 
{ 
    File.Delete(fullPath); 
} 

Auch da Ihr, wenn die Bedingung overWrite Variable wird überprüft, stellen Sie sicher, dass der Wert von overWrite wahr ist. Ich schlage vor, dass Sie Visual Studio-Haltepunkte setzen und den Wert dieser booleschen Variablen und die Variableneigenschaft fullPath untersuchen.

Auch ich bin mir nicht sicher, was der Wert von saveDirectory Variable ist. Wenn es nicht der vollständige physische Dateipfad auf dem Webserver ist, verwenden Sie Server.MapPath, um das zu erhalten.

+0

Danke, ich werde das versuchen. –

+1

Ich habe das Problem gefunden, nach dem File.Exists gesucht hat.jpeg, während die alte Datei .jpg war –

0

Sind Sie sicher, dass Sie den Schrägstrich im Dateipfad für Ihren if-check nicht verpassen?

if (overWrite && File.Exists(saveDirectory + fileName)) 

Vielleicht möchten Sie den Code, um zu versuchen zu ändern, um mehr wie:

if (overWrite && File.Exists(saveDirectory + "\\" + fileName)) 
+0

Ich habe den Schrägstrich bereits in einer anderen Methode hinzugefügt, bevor ich den Pfad übergeben habe. Ich möchte ihn jedoch ändern, so dass er am Ende nach einem Schrägstrich sucht, bevor er versucht, etwas zu tun. –

0

Ich habe das Problem gefunden. Die Datei.Exists suchte nach einer JPEG-Datei, wenn das Original eine JPG-Datei war. Daher fand File.Exists die Datei nicht, obwohl das Dateiformat wirklich das gleiche war. Geht nur um zu zeigen, überprüfen Sie auch Ihre tatsächlichen Dateiendungen!

Verwandte Themen