在导入之前重命名数百个文件,需要大幅度提高速度

时间:2018-08-02 19:02:37

标签: vb.net system.io.file

我们有一个导入,可以在实际导入任何数据之前重命名目录中的文件。它可以在我的机器上正常运行,但是我们的一些用户有硬件限制,当文件数超过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。

1 个答案:

答案 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)