Как дважды проверить, пуста ли папка? - PullRequest
0 голосов
/ 28 мая 2020

Я не могу найти решение своей проблемы. Мой код удаляет пустые папки и в целом работает нормально, но есть одно исключение. Он проходит каждый путь один раз, но если была папка (A), в которой была только пустая папка (B), то она удаляла бы только папку (B), поскольку папка (A) не была пустой в то время . Как я могу сделать это так, чтобы он понимал, что папка (A) будет пустой после удаления папки (B)?

Я думал, что DeleteEmptyFolder(folder.FullName) решит проблему, но он не работает, поскольку он не повторяет тот же путь, по которому уже прошел. Удаление directory.GetDirectories.Count = 0 тоже не работает, так как оно удалит любую папку, в которой нет файла (даже если в ней есть другая папка с файлами)

Private Sub DeleteEmptyFolder(ByVal sDirectoryPath As String)

            If IO.Directory.Exists(sDirectoryPath) Then
                Dim directory As New IO.DirectoryInfo(sDirectoryPath)
                If directory.GetDirectories.Count = 0 AndAlso directory.GetFiles.Count = 0 Then
                    directory.Delete(True)
                    Return
                End If
                For Each folder As IO.DirectoryInfo In directory.GetDirectories()
                    DeleteEmptyFolder(folder.FullName)
                Next
           End If
End Sub

Я новичок to VB. Net, так что извините, если это очевидный ответ, которого я не вижу.

Ответы [ 3 ]

1 голос
/ 28 мая 2020

Вот как должен выглядеть код:

Private Sub DeleteEmptyFolder(folderPath As String)
    If Directory.Exists(folderPath) Then
        For Each subFolderPath In Directory.EnumerateDirectories(folderPath)
            DeleteEmptyFolder(subFolderPath)
        Next

        If Directory.EnumerateFiles(folderPath).Any() OrElse
           Directory.EnumerateDirectories(folderPath).Any() Then
            Return
        End If

        Directory.Delete(folderPath)
    End If
End Sub

Нет смысла использовать DirectoryInfo, если вам не нужна никакая другая информация о файлах и папках, кроме пути. Вы должны использовать EnumerateFiles и EnumerateDirectories вместо GetFiles и GetDirectories, если вам специально не нужно заранее получить массив записей. В этом случае вы точно этого не сделаете. Допустим, у вас есть папка с 1000 файлами. Это:

directory.GetFiles.Count = 0

сначала создаст массив, содержащий элемент для всех 1000 файлов, а затем проверит количество элементов в нем. С другой стороны, это:

Directory.EnumerateFiles(folderPath).Any()

вернет True, как только обнаружит первый файл, игнорируя другие 999. Вам важно только, есть ли какие-либо файлы в папке, а не сколько их ар.

0 голосов
/ 28 мая 2020

Я решил проблему, переместив часть кода.

        Private Sub DeleteEmptyFolder(ByVal sDirectoryPath As String)

                If IO.Directory.Exists(sDirectoryPath) Then
                    Dim directory As New IO.DirectoryInfo(sDirectoryPath)
                    For Each folder As IO.DirectoryInfo In directory.GetDirectories()
                        DeleteEmptyFolder(folder.FullName)
                    Next
                    If directory.GetDirectories.Count = 0 AndAlso directory.GetFiles.Count = 0 Then
                        directory.Delete(True)
                        Return
                    End If
                End If
            End If
0 голосов
/ 28 мая 2020

Пожалуйста, попробуйте следующее:

    Private Sub deleteEmptyFolders(ByRef folder As String)

        'Does exist such a path?
        If IO.Directory.Exists(folder) Then 'yes

            'Loop over all directories
            For Each subFolder In IO.Directory.GetDirectories(folder)

                'Delete all empty folders
                deleteEmptyFolders(subFolder)
            Next

            'Delete folder if nothing remained in it
            Try
                My.Computer.FileSystem.DeleteDirectory(folder, FileIO.DeleteDirectoryOption.ThrowIfDirectoryNonEmpty)
            Catch ex As Exception
            End Try
        End If
    End Sub

Я думаю, это просто делает то, что вы хотите.

...