【问题标题】: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.DirectoryNotFoundException、System.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