Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - Общий форум

Страница: 1 |

 

  Вопрос: Удалить содержимое папки Добавлено: 22.04.05 09:32  

Автор вопроса:  Trusishka | ICQ: 229751913 
Люди как удалить содержимое папки. Я в VB полный лох, если можно примерчик.

Ответить

  Ответы Всего ответов: 9  

Номер ответа: 1
Автор ответа:
 sne



Разработчик Offline Client

ICQ: 233286456 

Вопросов: 34
Ответов: 5445
 Web-сайт: hw.t-k.ru
 Профиль | | #1
Добавлено: 22.04.05 10:04
Есть такое понятие - рекурсия...
Есть еще НеЧаВо - должно быть...

Ответить

Номер ответа: 2
Автор ответа:
 Страшный Сон



Вопросов: 46
Ответов: 848
 Профиль | | #2 Добавлено: 22.04.05 12:28
Удаляй рекурсивным методом.

Ответить

Номер ответа: 3
Автор ответа:
 Morpheus



Вопросов: 224
Ответов: 3777
 Web-сайт: xury.zx6.ru
 Профиль | | #3
Добавлено: 22.04.05 16:07
Кстати, хотел спросить, в каких случаях будет преполнение стека? когда глубина вложеных папок буде очень большая?

Ответить

Номер ответа: 4
Автор ответа:
 Александр



Разработчик Offline Client

ICQ: 204034 

Вопросов: 106
Ответов: 1919
 Профиль | | #4 Добавлено: 22.04.05 16:28
Есть еще НеЧаВо - должно быть...

Нету ;)

Ответить

Номер ответа: 5
Автор ответа:
 Sharp


Лидер форума

ICQ: 216865379 

Вопросов: 106
Ответов: 9979
 Web-сайт: sharpc.livejournal.com
 Профиль | | #5
Добавлено: 22.04.05 17:49
когда глубина вложеных папок буде очень большая?
Боюсь, такой вложенности папок не бывает, скорее имеется ошибка в программе.

Ответить

Номер ответа: 6
Автор ответа:
 Morpheus



Вопросов: 224
Ответов: 3777
 Web-сайт: xury.zx6.ru
 Профиль | | #6
Добавлено: 22.04.05 18:47
Да не,я теоретически думаю, ошибки нет

Ответить

Номер ответа: 7
Автор ответа:
 Pashenko



ICQ: 176176951 

Вопросов: 14
Ответов: 655
 Профиль | | #7 Добавлено: 22.04.05 21:51
А что, RD не работает?

Ответить

Номер ответа: 8
Автор ответа:
 Neco



ICQ: 247906854 

Вопросов: 133
Ответов: 882
 Web-сайт: neco.pisem.net
 Профиль | | #8
Добавлено: 22.04.05 23:44
Рекурсия - это когда функция вызывает саму себя, либо те функции, которые она вызывает вызывают обсуждаемую функцию.
Стек - место в памяти, где хранятся переменные текущей функции. При рекурсии возможно переполнение стека, т.к. слишком глубокая рекурсия не даёт стеку возможность опустошаться, а опустошается он лишь при завершении функции. Однако эта хрень возможна лишь при очень навороченных деревьях - у меня даже в реестре ни разу её не было, поэтому забей.
Что такое "RD" я сам не знаю. Берусь предположить, что это RemoveDirectory, хотя может это какая-нить RealDelete про которую я не знаю.
Ремарка: эти определения не претендуют на абсолютную правильность. Это лишь то, как я понимаю эти вещи, почитав обрывками книги...
Ремарка №2: первую ремарку написал, чтобы мне тут же не сказали "Ламо, да это же ....", хотя всё ещё впереди.

Один из вариантов такой рекурсии чуть ниже. Можно ещё сделать через FieSystemObject, но мне так не нравится, поэтому даю этот код.

Option Explicit

Private Declare Function FindFirstFile Lib "kernel32.dll" Alias "FindFirstFileA" (ByVal lpFileName As String, ByRef lpFindFileData As WIN32_FIND_DATA) As Long
Private Declare Function FindNextFile Lib "kernel32.dll" Alias "FindNextFileA" (ByVal hFindFile As Long, ByRef lpFindFileData As WIN32_FIND_DATA) As Long
Private Declare Function FindClose Lib "kernel32.dll" (ByVal hFindFile As Long) As Long

Private Const MAX_PATH As Long = 260

Private Type FILETIME
    dwLowDateTime As Long
    dwHighDateTime As Long
End Type

Private Type WIN32_FIND_DATA
    dwFileAttributes As Long
    ftCreationTime As FILETIME
    ftLastAccessTime As FILETIME
    ftLastWriteTime As FILETIME
    nFileSizeHigh As Long
    nFileSizeLow As Long
    dwReserved0 As Long
    dwReserved1 As Long
    cFileName As String * MAX_PATH
    cAlternate As String * 14
End Type

Public Sub RecEnumFiles(strDir As String, strMask As String)
    Dim fHandle As Long, fData As WIN32_FIND_DATA
    Dim tmpStr As String
    With fData
        fHandle = FindFirstFile(strDir + "\*", fData)
        If fHandle > 0 Then
            Do
                If InStr(1, .cFileName, "." + vbNullChar) = 0 Then
                    tmpStr = Left$(.cFileName, InStr(1, .cFileName, vbNullChar) - 1)
                    If .dwFileAttributes And vbDirectory Then
                        If InStr(1, strDir, "\\";) > 0 Then
                            strDir = Replace$(strDir, "\\", "\";)
                        End If
                        RecEnumFiles strDir + "\" + tmpStr, strMask
                    End If
                End If
            Loop While FindNextFile(fHandle, fData) = 1
            FindClose fHandle
        End If
        
        fHandle = FindFirstFile(strDir + "\" + strMask, fData)
        If fHandle > 0 Then
            Do
                If Not CBool((.dwFileAttributes And vbDirectory)) Then
                    tmpStr = Left$(.cFileName, InStr(1, .cFileName, vbNullChar) - 1)
                    Debug.Print tmpStr
                    'Form1.Text1 = Form1.Text1 + vbCrLf + tmpStr
                End If
            Loop While FindNextFile(fHandle, fData) = 1
            FindClose fHandle
        End If
    End With
End Sub

Удаление файлов воткни там, где печать, а удаление папки сразу после рекурсивного вызова. Тока лучше юзай апишки
Private Declare Function RemoveDirectory Lib "kernel32.dll" Alias "RemoveDirectoryA" (ByVal lpPathName As String) As Long
Private Declare Function DeleteFile Lib "kernel32.dll" Alias ";DeleteFileA" (ByVal lpFileName As String) As Long
а то начнутся траблы, типа не смог удалить файлы и вылетел...

Кстати, если тебе надо удалить лишь одну папку, в которой нет вложенных (а вдруг?!), то могу предложить этот код, которым меня просветил Александр:

Private Function EnumFilesIn(strDir As String, strMask As String) As Long
    Dim strItem As String, strToFind As String, lngNum As Long
    strToFind = strDir + "\" + strMask
    strItem = Dir$(strToFind)
    Do While Len(strItem) > 0
        lngNum = lngNum + 1
        Debug.Print strItem
        'Text1.Text = Text1.Text + vbCrLf + strItem
        strItem = Dir$()
    Loop
    EnumFilesIn = lngNum
End Function

вызов функций для всех файлов типа такого
EnumFilesIn "i:\","*.*"
Вроде всё.

Ответить

Номер ответа: 9
Автор ответа:
 Pashenko



ICQ: 176176951 

Вопросов: 14
Ответов: 655
 Профиль | | #9 Добавлено: 25.04.05 15:38
Вот так, по-моему, попроще будет:
Dim MyDir As String

MyDir = "e:\1"
Shell "cmd /c rd /s /q " & MyDir
Sleep 100
Shell "cmd /c md " & MyDir

Ответить

Страница: 1 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам