【发布时间】:2018-08-02 19:02:37
【问题描述】:
我们有一个导入,它在实际导入任何数据之前重命名目录中的文件。它在我的机器上运行良好,但我们的一些用户有硬件限制,当文件数达到 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 文件上,对于一个小改动来说还不错。
作为参考,我在文件已经包含所需字符串之后再次运行代码,并且在 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 毫秒……哎呀。
【问题讨论】:
-
您是否真的需要重命名文件,或者您可以创建一个您喜欢的名称的文件夹并将文件移动到其中。不确定这是否会提高性能。
-
您似乎已经将该问题确定为硬件限制。也许您可以将重命名重写为backgroundworker 并向用户提供某种进度指示器。只要用户看到正在取得进展,他们就希望不会干扰它。
-
@TerryCarmen 这早在我之前就已经存在了,我们假设在某处有查询在查询中使用了这个包含的字符串,我们希望保持原样,以免打扰事情。跨度>
-
@AndrewMorton 用户理解它很慢,但希望提高效率的真正原因是当文件太多时它似乎不起作用,没有错误代码我我假设它必须与内存相关。
-
@haag1 假设没有意义,这与猜测相同。是否真的出现了错误,或者用户只是放弃并按下计算机上的重置按钮?您必须找出真正的问题才能解决它;)
标签: vb.net system.io.file