0

只要文件不存在,以下代码就会移动文件。如果是这样,它不会移动文件。

我的问题是关于File.Move. msgbox 什么时候显示?它会在文件完全移动后显示还是File.Move在行执行后立即显示。

根据文件大小,移动文件可能需要一段时间,因此我不希望在文件完全移动之前显示 msgbox。

有没有更好的方法来做到这一点?

        For Each foundFile As String In My.Computer.FileSystem.GetFiles("C:\Temp\", FileIO.SearchOption.SearchAllSubDirectories, "*.zip")
            Dim foundFileInfo As New System.IO.FileInfo(foundFile)

            If My.Computer.FileSystem.FileExists("C:\Transfer\" & foundFileInfo.Name) Then
                Msgbox("File already exists and will not moved!")
                Exit Sub
            Else
                File.Move(foundFile, "C:\Transfer\" & foundFileInfo.Name)
                Msgbox("File has been moved!")
            End If
        Next
4

5 回答 5

5

根据这个来源File.Move调用是同步的,这意味着您的 msgbox 将仅在文件移动后显示,而不管其大小。

为了完整起见,如果您不想阻止 UI,可以尝试以下操作:

' This must be placed outside your sub/function
Delegate Sub MoveDelegate(iSrc As String, iDest As String)

' This line and the following go inside your sub/function
Dim f As MoveDelegate = AddressOf File.Move

' Call File.Move asynchronously
f.BeginInvoke(
    foundFile, 
    "C:\Transfer\" & foundFile, 
    New AsyncCallback(Sub(r As IAsyncResult)
                          ' this code is executed when the move is complete
                          MsgBox("File has been moved!")
                      End Sub), Nothing)

或者您可以探索新的async / await指令。

于 2012-10-18T17:35:52.723 回答
3

File.Move 是一个同步操作,因此应用程序在移动完成之前不会执行下一行代码(您的消息框)。

正如您所指出的,如果文件很大(并且您正在跨驱动器移动),则在文件移动完成之前不会显示消息框。这可能会造成糟糕的用户体验,因为您的 GUI 在此期间似乎没有响应。

我建议花时间学习如何利用后台线程或 async/await 调用在后台执行操作。

MSDN上有一篇关于异步IO的好文章:http: //msdn.microsoft.com/en-us/library/kztecsys.aspx

最后,您还可以使用 FileSystem 对象的MoveFile方法,如果您只是担心保持 UI 响应,它可以为您弹出文件移动 UI:

FileSystem.MoveFile(sourceFileName, destinationFileName, UIOption.AllDialogs)
于 2012-10-18T17:35:58.190 回答
2

不幸的是,代码是逐行执行的,因此Msgbox只要文件已完全移动,就会弹出。

如果您想监控进度,请访问此链接了解更多详情

于 2012-10-18T17:34:50.847 回答
2

文件完全移动后,无论文件大小如何,都会显示消息框。

于 2012-10-18T17:35:56.193 回答
1

除非方法是异步的,否则一行代码总是会在继续执行下一行之前完成执行。

请注意,如果文件移动很慢,并且它阻止您的程序是一件坏事,那么您可以在后台线程中使用例如BackgroundWorker.

于 2012-10-18T17:37:18.120 回答