2017-06-15 267 views
0

我已經創建了一個臨時文件夾來保留一些音頻文件。我的意圖是將音頻文件加入一個文件後刪除此臨時文件夾。使用c刪除文件夾後刪除文件夾#

這裏是我的代碼,創建目錄裏面directoryName臨時文件的一部分:

是連接所有臨時文件
fileName = fileCounter.ToString() + ".wav"; 
fileCounter++; 
fileName = directoryName + "\\" + fileName; 

代碼如下:

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

我有幫助,從這個question

這裏是我的代碼刪除文件

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

但問題中的代碼只刪除文件夾內的文件。但我想要刪除該文件夾。

+1

據我所知,你可以使用Directory.Delete和true刪除所有包含的文件和子目錄,不需要循環。 –

+0

可以很容易地找到答案:https:// stackoverflow。com/questions/1288718 /如何刪除所有文件和文件夾中的目錄 –

回答

2

在刪除文件夾之前,不需要刪除文件夾中的所有文件。 Directory.Delete(directoryName,true)應刪除目錄及其中的所有文件/子目錄。

無論如何,你應該附上這在一個try/catch,彷彿任何內部文件正在使用中它會拋出一個IOException

+0

如果有任何文件正在使用,此方法將拋出「Exception」。這需要注意避免異常 – GauravKP

+0

你是對的@GauravKP。編輯以顯示可能性 – Pikoh

+0

@Pikoh你是正確的'Directory.Delete(directoryName,true)'刪除它中的所有文件和文件夾。但它只會刪除directoryName的內容。我也想刪除directoryName。 –

1

丙的Directory.Delete#有一個遞歸的標誌,你可以用它來刪除目錄及所有內容。使用這個,你不必手動刪除所有的文件。

簡單地傳遞true作爲第二個參數Directory.Delete:

Directory.Delete(directoryName, true);   

使用時需謹慎!

0

(這無關你的問題,但我張貼作爲一個答案,因爲它是一個評論太麻煩了。)

的拼接方法的代碼可以簡化,減少了一半:

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

感謝您的建議。 –

0

考慮使用System.IO.Path類來創建臨時文件夾。

另外考慮使用DirectoryInfo和FileInfo作爲文件和文件夾而不是字符串。畢竟:文件不是字符串。文件的名稱是一個字符串。除了使用的DirectoryInfo和FileInfo的確保,如果你想創建/重命名/移動/刪除文件和文件夾或更改擴展

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

該文件夾的創建,填充和刪除的還有與文件的名稱沒有問題不用擔心,因爲您確定沒有人會使用它,因爲沒有人擁有您的文件夾名稱。

使用Path.Combine可以確保您不必擔心斜槓'\'。除了你的代碼將被移植到其他系統上使用,不使用反斜槓作爲分隔符。