2015-05-05 35 views
1
Dim FolderName As New IO.DirectoryInfo(FileLocationFolder) 
Dim diar1 As IO.FileInfo() = FolderName.GetFiles("*.xml") 

我通過像下面處置的FileInfo()

For Each CurrFile In diar1 
Next 

這是否鎖定在該目錄中的所有文件diar1循環?

如果是這樣,我完成後該如何處理?任何幫助,將不勝感激。

這裏是我的代碼的其餘部分:

Public Sub Get_FTP_video(ByVal curr As Integer) 
    Try 

     Dim FolderName As New IO.DirectoryInfo(FileLocationFolder) 
     Dim diar1 As IO.FileInfo() = FolderName.GetFiles("*.xml") 

     Dim CurrFile As IO.FileInfo 
     Dim CurrfileName As String 
     Dim currsize, MinSize As Integer 
     currsize = 0 
     MinSize = 0 

     For Each CurrFile In diar1 
      CurrfileName = CurrFile.Name 

      If CurrFile.CreationTime.Date = Today.Date Then 
       GET_FileName(FileLocationFolder & CurrfileName, currsize) 
       If MinSize = 0 Then 
        MinSize = currsize 
       Else 
        If currsize < MinSize Then 
         splitter = CurrFile.Name.Split(".") 
         If My.Computer.FileSystem.FileExists(FileLocationFolder & splitter(0).ToString & ".mp4") Then 
          MinSize = currsize 
          newVideoName = splitter(0).ToString 
         End If 
        End If 
       End If 
      End If 
     Next 

     System.IO.File.Move(FileLocationFolder & videonamee & ".mp4", MoveFileToFolder & videonamee) 
     sendmessage = True 

     MoveAllFilesToBin() 

    Catch ex As System.Data.SqlClient.SqlException 
    Catch ex As Exception 
    End Try 
End Sub 

'

Public Sub GET_FileName(ByVal directorytracer As String, ByRef fileSize As Integer) 
     Try 
      Dim xmldoc As New XmlDataDocument() 
      Dim mmm As New XmlDataDocument 
      Dim xmlnode As XmlNodeList 
      Dim i As Integer 
      Dim str As String 
      Dim fs As New FileStream(directorytracer, FileMode.Open, FileAccess.Read) 
      xmldoc.Load(fs) 
      Dim ds As New DataSet 
      Dim xmlNodeRdr As XmlNodeReader 
      xmlnode = xmldoc.GetElementsByTagName("item") 

      For i = 0 To xmlnode.Count - 1 
       str = xmlnode(i).ChildNodes.Item(3).InnerXml 
       mmm.InnerXml = str 
       xmlNodeRdr = New XmlNodeReader(mmm) 
       ds.ReadXml(xmlNodeRdr) 
       fileSize = CInt(ds.Tables(0).Rows(0).Item(0).ToString) 
      Next 

     Catch ex As System.Data.SqlClient.SqlException 

     Catch ex As Exception 

     End Try 

    End Sub 

該錯誤發生在這樣的功能:

Sub MoveAllFilesToBin() 
    Try 
     Dim FolderName As New IO.DirectoryInfo(FileLocationFolder) 
     Dim diar1 As IO.FileInfo() = FolderName.GetFiles() 
     For Each CurrFile In diar1 
      If System.IO.File.Exists(BinFolderFTP & CurrFile.Name) Then 
       System.IO.File.Delete(BinFolderFTP & CurrFile.Name) 
      End If 
      System.IO.File.Move(FileLocationFolder & CurrFile.Name, BinFolderFTP & CurrFile.Name) 
     Next 

     Catch ex As System.Data.SqlClient.SqlException 
     Catch ex As Exception 
    End Try 
End Sub 

The process cannot access the file because it is being used by another process. 
    at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath) 
    at System.IO.__Error.WinIOError() 
    at System.IO.File.Move(String sourceFileName, String destFileName) 

回答

2

在GET_FileName中,打開FileStream並且既不關閉也不處理。最簡單的解決方案是使用Using塊封裝您的FileStream用法。您可以在創建FileStream時立即啓動該塊,並在xmldoc.Load(fs)之後立即結束,因爲之後不再需要它。這對於實現IDisposable的任何事情都很好。

5

創建FileInfo對象不打開或鎖定的文件,因此沒有關閉或開啓。 FileInfo沒有實現IDisposable,所以沒有什麼可處置的。你不需要做任何特殊的事情,這些對象在沒有引用它們之後的一段時間會被垃圾收集。

+0

當我在代碼的其餘部分使用這些文件時,它們引起了我的問題。我收到以下錯誤:進程無法訪問該文件,因爲它正在被另一個進程使用 – HelpASisterOut

+1

@HelpASisterOut:不是'FileInfo()'導致您遇到問題,但您如何使用它們。但是你沒有顯示代碼。也許你打開了一個流而沒有關閉它。 –

+0

我不認爲問題可能是你創建了'FileInfo'對象。由於某些其他原因,該文件必須處於使用狀態。 – Blackwood