My.Computer.FileSystem.DeleteDirectory()只读文件?

时间:2010-09-23 04:34:26

标签: .net vb.net

我最近遇到了My.Computer.FileSystem.DeleteDirectory()的问题。它不会删除只读文件。

我通过谷歌搜索发现我可以通过将文件属性更改为“正常”来删除只读文件。所以我写了一个递归函数,如下所示。

Private Sub DeleteDir(ByVal dir As DirectoryInfo)

    For Each d In dir.GetDirectories
        DeleteDir(d)
    Next
    For Each f In dir.GetFiles
        Try
            f.Attributes = FileAttributes.Normal
            f.Delete()
        Catch ex As Exception
            Log(ex.Message)
        End Try
    Next
    dir.Delete(True)
End Sub

它似乎工作正常,但如果My.Computer.FileSystem.DeleteDirectory()有另一个参数来删除只读文件,或者有一种更简单的方法可以做到这一点,那就太好了。

2 个答案:

答案 0 :(得分:2)

简短的回答是框架中没有提供方法。你必须发展自己的。你写的很好。我更喜欢以下内容,因为它使用了扩展方法,并且更清楚地描述了该方法的作用。

Imports System
Imports System.IO
Imports System.Runtime.CompilerServices
Imports System.Linq

Public Module DirectoryExtensions

    <Extension()>
    Public Sub Delete(directory As DirectoryInfo, 
                      recursive As Boolean, 
                      forceReadOnlyDelete As Boolean
    )
        directory.ForceDelete()
    End Sub

    <Extension()>
    Public Sub ForceDelete(ByVal directory As DirectoryInfo)

        directory.RemoveReadOnlyAttributeFromFiles(True)
        directory.Delete(True)

    End Sub

    <Extension()>
    Public Sub RemoveReadOnlyAttributeFromFiles(ByVal directory As DirectoryInfo, ByVal recursive As Boolean)

        Dim readOnlyFiles = From f In directory.GetFiles()
            Where (f.Attributes And FileAttributes.ReadOnly) = FileAttributes.ReadOnly

        For Each file In readOnlyFiles
            file.Attributes = FileAttributes.Normal
        Next

        If recursive Then

            For Each subDirectory In directory.GetDirectories()
                subDirectory.RemoveReadOnlyAttributeFromFiles(True)
            Next

        End If

    End Sub

End Module

答案 1 :(得分:1)

我的理解是My命名空间中的类部分意味着新开发人员(可能具有VB6背景)的拐杖,它发现.Net框架有点压倒性。如果他们使My命名空间太大,我认为它会破坏更容易找到内容的目的。我还假设他们可能只有有限的资源来构建该命名空间并且必须具有很强的选择性。 / p>

解决方案是让您按照自己的意愿完成并编写自己的方法,然后将其与其他有用的辅助函数一起放入类库或类似函数中,然后可以轻松地将这些函数包含在所有项目中。< / p>

顺便说一下,请记住dir.Delete(True)也可以抛出异常。