【问题标题】:Dispose FileInfo()释放 FileInfo()
【发布时间】:2015-05-05 13:32:35
【问题描述】:
 Dim FolderName As New IO.DirectoryInfo(FileLocationFolder)
 Dim diar1 As IO.FileInfo() = FolderName.GetFiles("*.xml")

我正在循环通过 diar1,如下所示

 For Each CurrFile In diar1
 Next 

这会锁定该目录中的所有文件吗?

如果是这样,我完成后如何处理它?任何帮助将不胜感激。

这是我的其余代码:

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)

【问题讨论】:

    标签: vb.net system.io.fileinfo system.io.file


    【解决方案1】:

    创建FileInfo 对象不会打开或锁定文件,因此无需关闭或解锁任何内容。 FileInfo 没有实现IDisposable,所以没有什么可处置的。你不需要做任何特别的事情,对象将在没有引用它们的一段时间后被垃圾回收。

    【讨论】:

    • 当我在其余代码中使用文件时,它们会给我带来问题。我收到以下错误:该进程无法访问该文件,因为它正在被另一个进程使用
    • @HelpASisterOut:不是FileInfo() 给你带来了问题,而是你如何使用它们。但是您还没有显示代码。也许你打开了一个流但没有关闭它。
    • 我认为问题不在于您创建了 FileInfo 对象。由于某些其他原因,该文件必须正在使用中。
    • 这看起来像是您的潜在问题。 FileStream 已打开,既不是 Closed 也不是 Disposed。最简单的解决方案是使用 Using 块包装您的 FileStream 使用情况。您可能可以在创建 FileStream 时开始该块并在 xmldoc.Load(fs) 之后立即结束它,因为之后您不再需要它。这对任何实现 IDisposable 的东西都有好处。附带说明一下,像这段代码那样吃异常并不是一个好习惯,而且在没有访问 SQL Server 时捕获 SqlException 很奇怪。
    • 还有一点需要注意,GET_FileName 不是一个好的方法名,因为它实际上并不返回文件名。此外,此方法确实应该实现为返回 Integer 的函数,而不是设置在 ByRef 中传递的 Integer。返回一个值使函数更易于使用,也更便于人们稍后阅读代码,因为 VB 没有任何通知表明传入的参数是调用站点的 ByRef。
    【解决方案2】:

    在 GET_FileName 中,FileStream 是打开的,既不是 Closed 也不是 Disposed。最简单的解决方案是使用 Using 块包装您的 FileStream 使用情况。您可能可以在创建 FileStream 时开始该块并在 xmldoc.Load(fs) 之后立即结束它,因为之后您不再需要它。这对任何实现 IDisposable 的东西都有好处。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-11-09
      • 1970-01-01
      • 2011-05-03
      • 1970-01-01
      • 1970-01-01
      • 2011-05-08
      • 1970-01-01
      相关资源
      最近更新 更多