我正在尝试删除整个目录,但我遇到了问题。
问题
尝试删除目录时,它无法正常工作。我知道Stackoverflow HATES可以回答,但这是事实,没有错误。事实上,它给了我成功的'信息。
这就是它变得棘手的时候。如果我在目录中创建一个文件夹并添加一些虚拟文件,它将起作用,但如果我将它与已经存在的文件夹一起使用,则不会删除它。
Dim loc As String = "\\drtnas01\storeprofiles" 'Profile Location
Dim dfile As String = "\" & BatchTextBox.Text
Dim path As String = loc & dfile
VDIRebuildBG.ReportProgress(10, "Looking for Profile")
BatchStatusBox.Style = ButterscotchAlertBox.AlertStyle.Success
If Directory.Exists(path) Then
VDIRebuildBG.ReportProgress(20, "Profile Found")
BatchStatusBox.Style = ButterscotchAlertBox.AlertStyle.Success
Try
VDIRebuildBG.ReportProgress(30, "Starting Rebuild")
System.IO.Directory.Delete(path, True)
Catch
VDIRebuildBG.ReportProgress(100, "Error Rebuilding")
BatchStatusBox.Style = ButterscotchAlertBox.AlertStyle.Error
End Try
VDIRebuildBG.ReportProgress(100, "Profile Rebuilt")
BatchStatusBox.Style = ButterscotchAlertBox.AlertStyle.Success
Else
VDIRebuildBG.ReportProgress(100, "Profile Not Found")
BatchStatusBox.Style = ButterscotchAlertBox.AlertStyle.Error
Exit Sub
End If
注意,我有权限,因为我可以手动删除文件夹。
注意2:文件夹位于服务器上(所以它有点慢),文件夹的大小是50-100mb,不确定它是否超时或什么?
编辑:为了它的原因,我复制了一个文件夹,并将其放入我的测试文件夹,然后尝试了,它没有删除。这导致我发现它与尺寸有关。
编辑II(3/16):我做了一些测试,并希望转发我发现的信息。运行要删除的代码,将删除文件夹中的所有文件,但不会删除文件结构。如果我再次运行代码,它将不会删除任何剩余的文件夹。我还尝试硬编码要删除的子文件夹深处的文件夹路径(注意,该文件夹为空),并且也不会删除该文件夹。
我还通过在我的桌面上拥有一个文件夹(包含多个子文件夹)来测试权限问题,在那里我可以完全访问。这样做会导致同样的问题。
答案 0 :(得分:3)
好吧,看起来像Directory.Delete方法有一些问题(比如我上面的评论中没有删除带有自定义图标的文件夹)。
我建议您使用FileSystem.DeleteDirectory代替..
所以,试着替换这一行:
System.IO.Directory.Delete(path, True)
使用:
My.Computer.FileSystem.DeleteDirectory(path, FileIO.UIOption.OnlyErrorDialogs, FileIO.RecycleOption.DeletePermanently)
或如果您不想永久删除目录(仅限本地文件夹):
My.Computer.FileSystem.DeleteDirectory(path, FileIO.UIOption.OnlyErrorDialogs, FileIO.RecycleOption.SendToRecycleBin)
我已经尝试过了,它解决了我的问题......可能它也会解决你的问题。
参考: How to: Delete a Directory in Visual Basic
我希望这会有所帮助:)
答案 1 :(得分:0)
我有一个同事遇到Directory.Delete
工作不正常的问题。因此,我很好奇基于Ahmed Abdelhameed的帖子的区别是什么。
如果对Microsoft.VisualBasic.dll进行反编译,则会发现My.Computer.FileSystem.DeleteDirectory
如果不显示UI则最终调用System.IO.Directory.Delete
,否则,如果显示UI则调用shell32.dll。
因此,如果您呼叫DeleteDirectory(path, DeleteDirectoryOption.DeleteAllContents)
,那么它最终会呼叫Directory.Delete(fullPath, true)
。
现在,您可能会注意到变量名从DeleteDirectory(path)
更改为Directory.Delete(fullPath)
。这是因为DeleteDirectory(path)
这样做:String fullPath = System.IO.Path.GetFullPath(path)
(https://referencesource.microsoft.com/#mscorlib/system/io/path.cs,1274738792cce835),然后传入fullPath值。
现在,如果您查看System.IO.Directory.Delete代码(https://referencesource.microsoft.com/#mscorlib/system/io/directory.cs,7edbf8078ebb7f63),您将看到调用Delete(path, recursive)
时,它执行的操作与调用{{ 1}}(https://referencesource.microsoft.com/#mscorlib/system/io/path.cs,72f9fabbc9d544a5),然后使用它来调用名为System.IO.Path.GetFullPathInternal(path)
的内部/私有函数。
公众Delete(fullPath, userPath, recursive, checkHost)
首先呼叫GetFullPath
,但也呼叫(对于非核心用户)GetFullPathInternal(path)
。 FileIOPermission.QuickDemand(FileIOPermissionAccess.PathDiscovery, fullPath, false, false)
不调用GetFullPathInternal
方法。
因此,公用Directory.Delete方法通过直接调用QuickDemand
来绕过QuickDemand
检查。这可能是因为内部的GetFullPathInternal
方法最终会调用Directory.Delete
,所以也许他们认为他们不需要调用PathDiscovery权限是因为他们正在调用Write权限。
这是我的猜测,为什么VB FileIOPermssion.QuickDemand(FileIOPermissionAccess.Write, demandPath, false, false)
没有提供Directory.Delete有时会引发访问被拒绝的异常。如果有人遇到了合适的情况,将来会导致此故障,我很好奇,是否致电FileSystem.DeleteDirectory
解决了该问题。