2017-06-15 2 views
0

Ich habe einen temporären Ordner erstellt, um einige Audiodateien zu behalten. Ich beabsichtige, diesen temporären Ordner zu löschen, nachdem ich die Audiodateien in eine Datei eingefügt habe.Löschen Sie einen Ordner nach dem Löschen seines Inhalts mit C#

Hier ist der Teil meines Codes, die temporäre Dateien im Verzeichnis directoryName erstellt:

fileName = fileCounter.ToString() + ".wav"; 
fileCounter++; 
fileName = directoryName + "\\" + fileName; 

Code, der wie folgt ist alle temporären Dateien verbindet:

public void Concatenate(string outputFile, List<string> sourceFiles) 
{ 
    byte[] buffer = new byte[1024]; 
    WaveFileWriter waveFileWriter = null; 
    try 
    { 
     foreach (string sourceFile in sourceFiles) 
     { 
      using (WaveFileReader reader = new WaveFileReader(sourceFile)) 
      { 
       if (waveFileWriter == null) 
       { 
        // first time in create new Writer 
        waveFileWriter = new WaveFileWriter(outputFile, reader.WaveFormat); 
       } 
       else 
       { 
        if (!reader.WaveFormat.Equals(waveFileWriter.WaveFormat)) 
        { 
         throw new InvalidOperationException("Can't concatenate WAV Files that don't share the same format"); 
        } 
       } 

       int read; 
       while ((read = reader.Read(buffer, 0, buffer.Length)) > 0) 
       { 
        waveFileWriter.WriteData(buffer, 0, read); 
       } 
      } 
     } 
    } 
    finally 
    { 
     if (waveFileWriter != null) 
     { 
      waveFileWriter.Dispose(); 
     } 
    } 
} 

Ich hatte von dieser question Hilfe

Hier ist mein Code zum Löschen der Dateien

private void DeleteDirectory() 
{ 
    string[] files = Directory.GetFiles(directoryName); 
    foreach (string file in files) 
    { 
     File.Delete(file); 
    } 
    Directory.Delete(directoryName);    
} 

Der Code in der Frage löschte jedoch nur Dateien innerhalb des Ordners. Aber ich möchte den Ordner auch löschen.

+1

Soweit ich weiß, können Sie Directory.Delete mit True verwenden, um alle enthaltenen Dateien und Unterverzeichnisse zu löschen und die Schleife nicht benötigen. –

+0

Konnte die Antwort leicht gefunden haben: https: // stackoverflow.com/questions/1288718/how-to-delete-all-files-and-folders-in-directory –

Antwort

2

Sie müssen nicht alle Dateien im Ordner löschen, bevor Sie sie löschen. Directory.Delete(directoryName,true) sollte das Verzeichnis und alle darin enthaltenen Dateien/Unterverzeichnisse löschen.

Auf jeden Fall sollten Sie dies in einem try/catch umschließen, als ob eine der Dateien innerhalb in Gebrauch ist, wäre es ein IOException

+0

Diese Methode wird "Exception" auslösen, wenn eine der Dateien verwendet wird. Dies muss darauf achten, Ausnahme zu vermeiden – GauravKP

+0

Sie haben Recht @GauravKP. Bearbeitet, um diese Möglichkeit zu zeigen – Pikoh

+0

@Pikoh Sie sind richtig 'Directory.Delete (directoryName, true)' löscht alle Dateien und Ordner darin. Aber es löscht nur den Inhalt von directoryName. Ich möchte auch den Verzeichnisnamen löschen. –

1

C# 's Directory.Delete hat eine rekursive Flag, das Sie das Verzeichnis löschen verwenden können, werfen und all seine Inhalte. Damit müssen Sie nicht zuerst alle Dateien manuell löschen.

einfach passieren wahr als das zweite Argument zu Directory.Delete:

Directory.Delete(directoryName, true);   

Gebrauch mit Vorsicht!

0

(Dies ist in keinem Zusammenhang mit Ihrer Frage, aber ich bin als Antwort veröffentlichen, weil es für einen Kommentar zu unhandlich ist.)

Der Code des Concatenate Verfahren vereinfacht und um die Hälfte reduziert werden kann:

public void Concatenate(string outputFile, List<string> sourceFiles) 
{ 
    using (WaveFileWriter waveFileWriter = new WaveFileWriter(outputFile, reader.WaveFormat)) 
    { 
     foreach (string sourceFile in sourceFiles) 
     { 
      using (WaveFileReader reader = new WaveFileReader(sourceFile)) 
      { 
       if (reader.WaveFormat.Equals(waveFileWriter.WaveFormat)) 
        reader.CopyTo(waveFileWriter); 
       else 
        throw new InvalidOperationException("Can't concatenate WAV Files that don't share the same format"); 
      } 
     } 
    } 
} 
+0

Danke für den Vorschlag. –

0

Verwenden Sie die System.IO.Path-Klasse, um Ihren temporären Ordner zu erstellen.

Verwenden Sie auch DirectoryInfo und FileInfo für Ihre Dateien und Ordner anstelle von Zeichenfolgen. Immerhin: Eine Datei ist keine Zeichenkette. Eine Datei hat einen Namen, der eine Zeichenfolge ist. Neben der Verwendung von Directory und Fileinfo stellt sicher, dass es keine Probleme mit den Namen der Dateien, wenn Sie erstellen möchten/Umbenennen/Verschieben/Löschen von Dateien und Ordnern oder ändern Erweiterungen

var tmpFolderName = Path.Combine(Path.GetRandomPathName, Path.GetRandomFileName)); 
DirectoryInfo tmpFolder = Directory.Create(tmpFolderName) 

// Tmp file name of a file in tmpFolder: 
var tmpFileName = Path.Combine(tmpFolder.Name, fileName); 

// Delete the tmp folder and everything in it: 
tmpFilder.Delete(true); 

Dieser Ordner kann erstellt, gefüllt und gelöscht werden ohne Sorgen, weil Sie sicher sind, dass niemand es verwenden wird, da niemand Ihren Ordnernamen hat.

Durch die Verwendung von Path.Combine müssen Sie sich keine Gedanken über Schrägstriche '\' machen. Außerdem wird Ihr Code portabel sein, um auf anderen Systemen verwendet zu werden, die keine Backslashes als Trennzeichen verwenden.

Verwandte Themen