使用c#删除其内容后删除文件夹

时间:2017-06-15 07:19:10

标签: c# winforms

我创建了一个临时文件夹来保存一些音频文件。我的意图是在将音频文件加入一个文件后删除此临时文件夹。

以下是我的代码中创建目录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);            
}

但问题中的代码只删除了文件夹中的文件。但我也想删除该文件夹。

4 个答案:

答案 0 :(得分:2)

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

无论如何,你应该将它包含在try / catch中,就好像里面的任何文件正在使用它会抛出IOException

答案 1 :(得分:1)

C#&#39; s Directory.Delete有一个递归标志,您可以使用它来删除目录及其所有内容。使用此功能,您不必先手动删除所有文件。

只需将true作为第二个参数传递给Directory.Delete:

Directory.Delete(directoryName, true);        

谨慎使用!

答案 2 :(得分:0)

(这与您的问题无关,但我发布的答案是因为评论过于笨拙。)

Concatenate方法的代码可以简化并缩减一半:

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

答案 3 :(得分: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确保您不必担心斜线&#39; \#39;。此外,您的代码将可移植以用于其他系统,不会使用反斜杠作为分隔符。