繁体   English   中英

有条件删除文件的更好方法是什么

[英]What is better way to delete file with condition

我想在c#上构建一个win服务(无UI),它所做的全部就是:在目录列表上运行并删除X kb以上的文件。 我想要更好的表现

什么是更好的方法呢? 没有用于删除文件的纯异步功能,因此,如果我想使用异步等待,我可以像下面这样包装该功能:

public static class FileExtensions {
   public static Task DeleteAsync(this FileInfo fi) {
      return Task.Factory.StartNew(() => fi.Delete() );
   }
}

并像下面这样调用此函数:

FileInfo fi = new FileInfo(fileName);
await fi.DeleteAsync();

我想像

foreach file on ListOfDirectories
{

  if(file.Length>1000)
      await file.DeleteAsync

}

但使用此选项时,文件将一一删除(并且每个DeleteAsync将在threadPool中的线程上使用)。 所以我不能从异步中赚钱,我可以1比1做到。

也许我认为要收集列表中的X个文件,然后将它们删除为AsParallel

请帮助我找到更好的方法

您可以使用Directory.GetFiles("DirectoryPath").Where(x=> new FileInfo(x).Length < 1000); 获取小于1 KB的文件列表。

然后使用Parallel.ForEach这样遍历该集合:

var collectionOfFiles = Directory.GetFiles("DirectoryPath")
                                 .Where(x=> new FileInfo(x).Length < 1000);

Parallel.ForEach(collectionOfFiles, File.Delete);

可以说您应该使用:

Parallel.ForEach(collectionOfFiles, currentFile =>
{
    File.Delete(currentFile);
});

以提高代码的可读性。

MSDN有一个关于如何使用Parallel.ForEach()的简单示例

如果您想知道FileInfo对象,请参阅文档

这可能可以帮助您。

public static class FileExtensions
{
    public static Task<int> DeleteAsync(this IEnumerable<FileInfo> files)
    {
        var count = files.Count();
        Parallel.ForEach(files, (f) =>
        {
            f.Delete();
        });
        return Task.FromResult(count);
    }
    public static async Task<int> DeleteAsync(this DirectoryInfo directory, Func<FileInfo, bool> predicate)
    {
        return await directory.EnumerateFiles().Where(predicate).DeleteAsync();
    }
    public static async Task<int> DeleteAsync(this IEnumerable<FileInfo> files, Func<FileInfo, bool> predicate)
    {
        return await files.Where(predicate).DeleteAsync();
    }

}

在此处输入图片说明

在此处输入图片说明

        var _byte = 1;
        var _kb = _byte * 1000;
        var _mb = _kb * 1000;
        var _gb = _mb * 1000;
        DirectoryInfo d = new DirectoryInfo(@"C:\testDirectory");

        var deletedFileCount = await d.DeleteAsync(f => f.Length > _mb * 1);
        Debug.WriteLine("{0} Files larger than 1 megabyte deleted", deletedFileCount);
        // => 7 Files larger than 1 megabyte deleted

        deletedFileCount = await d.GetFiles("*.*",SearchOption.AllDirectories)
            .Where(f => f.Length > _kb * 10).DeleteAsync();

        Debug.WriteLine("{0} Files larger than 10 kilobytes deleted", deletedFileCount);
        // => 11 Files larger than 10 kilobytes deleted

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM