2012-10-18 54 views
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 
+1

好吧,我有一种感觉它会完成,但想在运行代码行之前确定。 – Muhnamana

回答

5

对应于this sourceFile.Move调用是同步的,这意味着msgbox只有在文件被移动后才会显示,无论其大小如何。

为了完整起见,如果你不想阻止用户界面,你可以尝试这样的事:

' 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指令。

2

不幸的是,该代码后,其他执行行这样Msgbox将只要该文件已被完全移动弹出。

如果你想监视进度,visit this link for more details

2

文件完全移动后将显示消息框,与文件大小无关。

3

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

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

我会建议花时间学习如何利用后台线程或异步/等待调用来在后台执行操作。

有异步IO的好文章在MSDN:http://msdn.microsoft.com/en-us/library/kztecsys.aspx

最后,您还可以使用文件系统对象的MoveFile方法,它可以弹出一个文件移动UI给你,如果你只是担心让你的UI响应:

FileSystem.MoveFile(sourceFileName, destinationFileName, UIOption.AllDialogs) 
1

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

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