【问题标题】:C# get Files from directory with specific CreationTimeC# 从具有特定 CreationTime 的目录中获取文件
【发布时间】:2021-11-04 05:55:08
【问题描述】:

我正在编写一个简短的代码来将文件从一个目录移动到另一个目录。我的代码很简单,工作正常,看起来像这样:

public void copy()
{
     string sourcePath = @"/Users/philip/Desktop/start";                                   
     string destinationPath = @"/Users/philip/Desktop/Ziel";                            

     string[] files = Directory.GetFiles(sourcePath)               
            
     foreach (string s in files)                                                 
     {
          string fileName = System.IO.Path.GetFileName(s);                               
          string destFile = System.IO.Path.Combine(destinationPath, fileName);
          System.IO.File.Copy(s, destFile, true);
     }
}

程序从源路径获取所有文件,并在 foreach 循环中将目标路径组合到每个文件中,包含目标路径和文件名。然后它移动它。一切正常。

我现在的目标是,不要将我目录中的所有文件都存储到字符串数组中。我只想获取 01.07.2021 之后具有 CreationTime 的文件。有没有简单快捷的方法?

我已经使用它来获取文件,但它指定了一个单一的日期,而不是特定日期之后的所有文件:

var files = Directory.GetFiles(sourcePath).Where(x => new FileInfo(x).CreationTime.Date == DateTime.Today.Date);

如果你能帮助我,我会很高兴。

最好的问候, 利亚姆

【问题讨论】:

  • 您好,谢谢您的回答。那将是一个选项,但我在一个目录中有超过 100.000 个文件,并且每个文件都将在 foreach 循环中检查某些条件。所以我想在检查所有文件之前过滤这 100.000 个文件,以提高代码效率。
  • 可以在检查它们之前按日期降序排列它们,另外我还建议你创建一个DirectoryInfo,然后使用DirectoryInfo.GetFiles,这样你就可以避免创建FileInfo
  • 您说“但它指定了一个单数日期”,这确实与使用的 == 匹配。你试过new FileInfo(x).CreationTime.Date > your_desired_date 吗?
  • 100000 个带有 Directory.GetFiles 的文件?查看 Directory.EnumerateFiles 以及为什么要处理很多文件时更好。

标签: c# linq file date path


【解决方案1】:

你可以使用FileInfo

FileInfo fileInfo = new(s);

if (fileInfo.CreationTime >= DateTime.Parse("01/07/2021"))
{
  ...
}

【讨论】:

    【解决方案2】:

    如果您不想检查每个FileInfo 的创建日期,您可以订购您的文件。像这样:

    var directory = new DirectoryInfo(sourcePath);
    var fileInfos = directory.GetFiles().OrderByDescending(fileInfo => fileInfo.CreationDate);
    
    var result = new List<FileInfo>();
    
    foreach (var fileInfo in fileInfos)
    {
        if (fileInfo.CreationDate >= DateTime.Today)
            result.Add(fileInfo);
        else
            break; // We can break early, because we ordered our dates descending
                   // meaning every date after this one is smaller
    }
    

    这有好处也有坏处,订购大量文件可能比“仅仅”简单地迭代所有文件并比较日期需要更长的时间,但您需要自己对其进行基准测试

    【讨论】:

    • 好的,谢谢您的信息。这就是我一直在寻找的。我将对它进行基准测试,并检查哪种方法的性能更好。
    • 这比只检查值要慢得多。它进行 N-1 比较,然后您迭代最少 1 个项目,所以 N,这是最好的情况,所以它是 N 到 2N。无论如何检查所有这些都是N。
    • @Franck 是的,这是有道理的。我通过检查值来实现它。感谢您的帮助
    猜你喜欢
    • 2021-06-08
    • 2010-12-03
    • 2018-04-03
    • 2023-03-28
    • 1970-01-01
    • 2019-11-03
    • 1970-01-01
    • 2013-02-07
    • 1970-01-01
    相关资源
    最近更新 更多