vb.net - 在导入之前重命名数百个文件,需要大幅加快速度
问题描述
我们有一个导入,它在实际导入任何数据之前重命名目录中的文件。它在我的机器上运行良好,但我们的一些用户有硬件限制,当文件数达到 500+ 范围时,它开始变慢甚至完全停止(当然,用户没有提供错误)。
我已经加快了这个过程,但我觉得问题在于使用“File.Move()”重命名文件,必须有更好的解决方案,对吧?
代码(客户姓名因匿名而被删除):
For Each file In items
Dim fName As String = IO.Path.GetFileName(file)
If (Not fName.ToUpper.Contains("xxxxxxxx")) Then
rname.renameFile(ftpPath & "\", fName, CustomerName & "_" & fName)
End If
Next
重新命名文件:
Public Sub renameFile(ByVal filePath As String, _
ByVal origfileName As String, _
ByVal newfileName As String)
Try
File.Move(filePath & origfileName, filePath & newfileName)
Catch ex As Exception
Throw New ArgumentException(ex.Message)
End Try
End Sub
我对代码所做的只是清理了第一个块,它每次都使用“IO.Path.GetFileName”而不是仅仅将它命名为一个变量,我在 707 个文件上节省了大约 9 秒的半秒,对于一点小变化来说还不错。
作为参考,我在文件已经包含所需的字符串之后再次运行了代码,并且在 1 毫秒内完成了所有这些。
编辑 - (使用“My.Computer.FileSystem.RenameFile”的另一次尝试):
For Each file In items
Dim fName As String = IO.Path.GetFileName(file)
If (Not fName.ToUpper.Contains("xxxxxxxx")) Then
My.Computer.FileSystem.RenameFile(ftpPath & "\" & fName, CustomerName & "_" & fName)
End If
Next
这实际上更慢,从 8,497 毫秒到 12,957 毫秒……嘎嘎。
解决方案
您可以尝试一件事.. 如果各种机器具有多核处理器,您可以尝试像这样并行化循环。它可能不会有很大的不同,但如果硬盘支持本机命令队列,那么可能会有一些好处。
Parallel.ForEach(items, Sub(file As String)
Dim fName As String = IO.Path.GetFileName(file)
If (Not fName.ToUpper.Contains("xxxxxxxx")) Then
renameFile(ftpPath & "\", fName, CustomerName & "_" & fName)
End If
End Sub)
推荐阅读
- authentication - ASP.NET Core:Cookie 未经过身份验证。失败消息:取消保护票证失败
- reactjs - React Native - 如何防止重新渲染“静态”组件
- javascript - 我可以使用 Discord API 在消息请求中保存信息吗?
- haskell - 有人可以解释这个 Haskell 问题吗?
- android - 搜索/过滤分页列表
- php - 用于 Nginx 和 php-fpm 的 Kubernetes Docker 上的连接错误
- firefox - 语音合成 API 在 Manjaro 上的 Firefox 中不起作用
- reactjs - Apollo Client 3 - 全局事件监听器?
- stata - 用抽样权重计算观测数
- javascript - 如何通过 ctrl + enter 将 br(换行符)添加到 contenteditable div?