【问题标题】:Unable to delete all files from temporary folders in vb.net无法从 vb.net 中的临时文件夹中删除所有文件
【发布时间】:2015-02-19 20:09:43
【问题描述】:

我正在使用以下代码从特定文件夹中删除所有文件:

Sub DeleteFiles(Folder As String)
    If Directory.Exists(Folder) Then
        For Each _file As String In Directory.GetFiles(Folder)

            File.Delete(_file)

        Next
        For Each _folder As String In Directory.GetDirectories(Folder)

            DeleteFiles(_folder)
        Next

    End If

End Sub

每当我使用上述代码通过使用 DeleteFiles("C:\Temp") 调用它来删除“C:\Temp”中的所有文件时,它都会成功删除所有文件,但每当我尝试使用相同的代码时对于删除“C:\Windows\TEMP\”中的文件,它会中断操作,表明该文件正在使用中。我希望代码不应该引发异常并立即停止删除文件。如果无法删除该文件,则代码应移至下一个文件并尝试删除它。这样,它应该能够从该目录中删除尽可能多的文件。

【问题讨论】:

    标签: vb.net visual-studio-2013


    【解决方案1】:

    您需要使用Try....Catch... 语句处理File.Delete() 引发的异常。我不是 VB 编码员(我很惊讶自己回答了这个问题),但这样的事情应该可以工作:

    Sub DeleteFiles(Folder As String)
        If Directory.Exists(Folder) Then
            For Each _file As String In Directory.GetFiles(Folder)
                Try 
                    File.Delete(_file)
                Catch e As System.IO.IOException
                    Console.WriteLine(e.Message)
                End Try
            Next
            For Each _folder As String In Directory.GetDirectories(Folder)
    
                DeleteFiles(_folder)
            Next
    
        End If
    
    End Sub
    

    这将捕获System.IO.IOException 异常,记录它已收到,然后忽略它。请注意,这将捕获许多其他与File.Delete() 相关的异常,例如System.IO.DirectoryNotFoundExceptionSystem.IO.PathTooLongException 等。如果要捕获这些异常,则必须在更通用的System.IO.IOException 之前为每个异常添加Catch 子句. here 列出了可能的例外情况,以及使用 File.Delete() 的示例 - 您只需阅读文档即可。

    您可能还想查看Directory.Delete 以递归删除目录、其文件及其子目录。

    【讨论】:

      【解决方案2】:

      您无法阻止抛出异常。您需要做的是捕获异常,适当地处理它(这可能意味着忽略它)并继续前进。这意味着在您的第一个循环中放置一个 Try...Catch 块。这样,当File.Delete 抛出异常时,您可以捕获它,忽略它,然后循环将继续。

      请确保只捕获您希望抛出的异常类型。否则,完全出乎意料的事情可能会导致问题,而您只是忽略它,这很糟糕。仅忽略您合理预期并知道可以安全忽略的异常。

      【讨论】:

        【解决方案3】:
        Dim temp As String = Environment.GetEnvironmentVariable("TEMP")
            Dim k As String() = System.IO.Directory.GetFiles(temp)
            Dim i As Integer
            For i = 0 To k.Length
                On Error Resume Next
                Kill(k(i))
                System.IO.File.Delete(k(i))
            Next
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-03-30
          • 1970-01-01
          相关资源
          最近更新 更多