以下代码正在移动文件,只要该文件尚不存在即可。如果是,则不会移动文件。
我的问题是关于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
答案 0 :(得分:5)
根据this source,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说明。
答案 1 :(得分: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)
答案 2 :(得分:2)
不幸的是,代码是一个接一个地执行的,因此只要文件已经完全移动,Msgbox
就会弹出。
如果您想监控进度visit this link for more details。
答案 3 :(得分:2)
无论文件大小如何,文件完全移动后都会显示消息框。
答案 4 :(得分:1)
除非方法是异步的,否则在继续下一行之前,一行代码将始终完成。
注意,如果文件移动速度很慢,并且它阻止你的程序是一件坏事,那么你可以使用例如BackgroundWorker
在后台线程中进行移动。