删除c#中多种文件类型的文件

时间:2014-12-15 15:59:47

标签: c#

我有以下解决方案来删除只有一个扩展名的单个文件类型;但是我试图找到一种方法来合并多个文件扩展名,例如:.wma, .mp3, .wav

DirectoryInfo di = new DirectoryInfo(@"C:\");
FileInfo[] files = di.GetFiles("*.mpeg")
                     .Where(p => p.Extension == ".mpeg").ToArray();
foreach (FileInfo file in files)
    try
    {
        file.Attributes = FileAttributes.Normal;
        File.Delete(file.FullName);
    }
    catch { }

4 个答案:

答案 0 :(得分:10)

嗯,这只是一个改变你的条件的问题"扩展名是一个集合中的任何一个"并从GetFiles调用中删除模式。另请注意,您不需要致电ToArray() - 只需迭代结果:

var extensions = new HashSet<string>(StringComparer.InvariantCultureIgnoreCase)
    { ".wma", ".mp3", ".wav" };

var files = new DirectoryInfo(@"c:\").GetFiles()
                                     .Where(p => extensions.Contains(p.Extension));
foreach (var file in files)
{
    // try/catch if you really need, but I'd recommend catching a more
    // specific exception
    file.Attributes = FileAttributes.Normal;
    File.Delete(file.FullName);    
}

答案 1 :(得分:5)

您可以将允许的扩展名存储在一个集合中,然后使用Enumerable.Contains

string[] allowedExtensions = { ".mpeg", ".wma", ".mp3", ".wave" };
FileInfo[] files = di.EnumerateFiles()
 .Where(p => allowedExtensions.Contains(p.Extension, StringComparer.InvariantCultureIgnoreCase))
 .ToArray();

请注意,我已经使用了DirectoryInfo.EnumerateFiles,在这种情况下效率可能更高,因为它不需要在开始处理之前将所有文件名加载到内存中(如DirectoryInfo.GetFiles) 。 StringComparer.InvariantCultureIgnoreCase应该是自我解释的。

答案 2 :(得分:4)

您可以在数组中使用扩展程序,然后从目录中获取所有文件,并比较每个扩展程序,如:

string[] fileExtensions = new[] { ".wma", ".mp3", ".wave" };
DirectoryInfo di = new DirectoryInfo(@"C:\");
FileInfo[] files = di.GetFiles()
                     .Where(p => fileExtensions.Contains(p.Extension)).ToArray();

如果您想要不区分大小写的比较,请使用:

FileInfo[] files = di.GetFiles()
                     .Where(p => fileExtensions.Contains
                    (p.Extension, StringComparer.InvariantCultureIgnoreCase)).ToArray();

答案 3 :(得分:0)

di.GetFiles().Where(
    p => p.Extension == ".mpeg" || 
    p.Extension == ".mp3" || 
    p.Extension == ".wave");