【问题标题】:How to get list of files which were updated today? .NET如何获取今天更新的文件列表? 。网
【发布时间】:2013-12-09 17:54:04
【问题描述】:

我在 FTP 服务器中有数千个文件,我可以使用 Windows 资源管理器进行连接。日复一日,晚上,我必须找到今天更改(上传)的文件并取他们的名字。 我想开发一个 Visual Basic 批处理应用程序,只需运行带有参数(日期)的 EXE,就可以获取这些文件的名称列表。

最近我在这里找到了这段代码:

source = "\\ftp_my\Upload\"
searchfor = "*"
Dim dirs As String() = Directory.GetFiles(source, searchfor)
For Each file In dirs
    fileinfo = New FileInfo(file)
    If (fileinfo.LastWriteTime >= DateAdd(DateInterval.Day, -1, Date.Today)) Then
        'execute my actions
    End If
Next

但是列出所有文件并评估它们的属性需要花费难以置信的时间。另一方面,如果我只是创建一个“目录”,导出到 excel,拆分文本并手动评估我想要的日期/文件,我比 VB 更早地完成了这项研究!

因此应该有一个命令在合理的时间内列出按日期 DESC 排序的文件,是吗?

【问题讨论】:

  • 您的两种方案之间的唯一区别是您没有将If 语句合二为一吗?
  • 代码中的“执行我的操作”需要多长时间?
  • 我的操作只是在 C:\TEMP 文件夹中写入文件名和日期。

标签: .net vb.net file-upload


【解决方案1】:

我注意到有几件事会减慢您的迭代速度。

您将每个文件名转换为一个 fileinfo 对象,而不是使用 fileinfo 对象的集合。

您正在为每个文件计算要检查的目标日期,而不是计算一次。

这是一种使用 LINQ 执行所需操作的方法,该方法可以在不到 5 秒的时间内在映射的网络驱动器上找到 1000 个文件(最坏的情况):

    Dim source = New DirectoryInfo("\\ftp_my\Upload\")
    Dim searchfor = "*"
    Dim TargetDate = DateAdd(DateInterval.Day, -1, Date.Today)
    Dim dirs = (From f As FileInfo In source.GetFiles(searchfor)
                Where f.CreationTime >= TargetDate
                Select f).ToList

dirs 将包含您要定位的每个文件的所有 fileinfo 对象。

如果遍历目录并完成对每个文件的操作需要很长时间,那么这将告诉您时间花费在哪里,您可以开始查看该代码并开始优化它以减少时间。

【讨论】:

  • 好吧 tinstaafl,我尝试了你的建议并列出 4300 个文件,使用你的解决方案,我得到了 36 分钟 - 这与前一个没有太大不同。 Peharps 的问题是网络连接,虽然我不明白为什么会发生这样的基本信息。此外,我采取的“行动”只是将文件名写入 c:\temp ——因此这应该不是问题。
  • 此外:这是一种使用 LINQ 执行所需操作的方法,该方法可以在不到 5 秒的时间内在映射的网络驱动器上找到 1000 个文件(最坏情况):我使用的服务帐号无法创建网络驱动器,因此我必须使用 \\ftp_asd\Upload ,当然,您知道我不应该发布正确的地址。
  • 是的。该信息只是为了显示我得到结果的情况。由于您是通过网络访问文件,因此您应该能够获得类似的结果。您的问题可能与网络有关。尝试计算您的吞吐量,您在这么长的时间内传输了多少数据,并将其与与其他站点的数据传输进行比较。
猜你喜欢
  • 2013-11-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多