使用c删除文件夹后删除文件夹#

问题描述:

我已经创建了一个临时文件夹来保留一些音频文件。我的意图是将音频文件加入一个文件后删除此临时文件夹。使用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:// *。com/questions/1288718 /如何删除所有文件和文件夹中的目录 –

在删除文件夹之前,不需要删除文件夹中的所有文件。 Directory.Delete(directoryName,true)应删除目录及其中的所有文件/子目录。

无论如何,你应该附上这在一个try/catch,仿佛任何内部文件正在使用中它会抛出一个IOException

+0

如果有任何文件正在使用,此方法将抛出“Exception”。这需要注意避免异常 – GauravKP

+0

你是对的@GauravKP。编辑以显示可能性 – Pikoh

+0

@Pikoh你是正确的'Directory.Delete(directoryName,true)'删除它中的所有文件和文件夹。但它只会删除directoryName的内容。我也想删除directoryName。 –

丙的Directory.Delete#有一个递归的标志,你可以用它来删除目录及所有内容。使用这个,你不必手动删除所有的文件。

简单地传递true作为第二个参数Directory.Delete:

Directory.Delete(directoryName, true);   

使用时需谨慎!

(这无关你的问题,但我张贴作为一个答案,因为它是一个评论太麻烦了。)

的拼接方法的代码可以简化,减少了一半:

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

感谢您的建议。 –

考虑使用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可以确保您不必担心斜杠'\'。除了你的代码将被移植到其他系统上使用,不使用反斜杠作为分隔符。