我们有一个导入,可以在实际导入任何数据之前重命名目录中的文件。它可以在我的机器上正常运行,但是我们的一些用户有硬件限制,当文件数超过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”,而不仅仅是将其命名为变量,我节省了大约9秒的半秒时间在707个文件上,进行一些小的更改还不错。
作为参考,在文件已经包含所需的字符串并在1ms内遍历所有文件之后,我再次运行了代码。
编辑-(另一次尝试使用“ 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,497ms到12,957ms ... gah。
答案 0 :(得分:2)
您可以尝试做的一件事。如果各种机器都具有多核处理器,则可以尝试像这样并行化循环。可能不会有很大的不同,但是如果硬盘支持本机命令队列,那么可能会有一些好处。
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)