删除目录

时间:2016-03-15 23:36:34

标签: vb.net

我正在尝试删除整个目录,但我遇到了问题。

问题

尝试删除目录时,它无法正常工作。我知道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):我做了一些测试,并希望转发我发现的信息。运行要删除的代码,将删除文件夹中的所有文件,但不会删除文件结构。如果我再次运行代码,它将不会删除任何剩余的文件夹。我还尝试硬编码要删除的子文件夹深处的文件夹路径(注意,该文件夹为空),并且也不会删除该文件夹。

我还通过在我的桌面上拥有一个文件夹(包含多个子文件夹)来测试权限问题,在那里我可以完全访问。这样做会导致同样的问题。

2 个答案:

答案 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解决了该问题。