Структура папок... как сделать?

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Dex
Постоялец
Постоялец
 
Сообщения: 346
Зарегистрирован: 09.08.2004 (Пн) 16:11

Структура папок... как сделать?

Сообщение Dex » 01.01.2005 (Сб) 6:27

Мне нужно получить полную структуру папок и занести это в ListBox.Я пытался написать код для создание стуктуры папок через DirListBox и FileListBox c помощью циклов но ничего не выходит, я запутываюсь. И начиная понимать как это сложно " чуть ли не вешуюсь" :cry: :cry: :cry: Помогите!!!Help!!! :(

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 01.01.2005 (Сб) 7:32

Рекурсия спасёт отца русской демократии?
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

GM
programador
programador
 
Сообщения: 1427
Зарегистрирован: 24.06.2003 (Вт) 15:56
Откуда: 194.67.52.100

Сообщение GM » 01.01.2005 (Сб) 11:23

Вот так:
Код: Выделить всё
'На форме List1
Private Declare Function FindFirstFile Lib "kernel32" Alias "FindFirstFileA" (ByVal lpFileName As String, lpFindFileData As WIN32_FIND_DATA) As Long
Private Declare Function FindNextFile Lib "kernel32" Alias "FindNextFileA" (ByVal hFindFile As Long, lpFindFileData As WIN32_FIND_DATA) As Long
Private Declare Function FindClose Lib "kernel32" (ByVal hFindFile As Long) As Long
Private Type FILETIME
    dwLowDateTime As Long
    dwHighDateTime As Long
End Type
Const MAX_PATH = 260
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
Function StripNulls(OriginalStr As String) As String
    If (InStr(OriginalStr, Chr(0)) > 0) Then
        OriginalStr = Left(OriginalStr, InStr(OriginalStr, Chr(0)) - 1)
    End If
    StripNulls = OriginalStr
End Function

Function EnumDirs(path As String, Optional level As Long = 0)
Dim sName As String, sSpace As String
Dim hSearch  As Long, bIsDirectory As Boolean
Dim Cont As Integer
On Error GoTo exitfromhere


If Right(path, 1) <> "\" Then path = path & "\"
sSpace = String(level, ".")
    Dim WFD As WIN32_FIND_DATA
   
    Cont = True
    hSearch = FindFirstFile(path & "*", WFD)
If hSearch <> -1 Then
        Do While Cont
        sName = StripNulls(WFD.cFileName)
       
If sName <> "." And sName <> ".." Then
bIsDirectory = (GetAttr(path & sName) And vbDirectory) = vbDirectory
List1.AddItem (sSpace & IIf(bIsDirectory, "[" & sName & "]", sName))
If bIsDirectory Then EnumDirs path & sName, level + 1
End If
     
Cont = FindNextFile(hSearch, WFD)
       
        Loop
End If
        Cont = FindClose(hSearch)



exitfromhere:


End Function
الفيجوال بيسك الرابح

Dex
Постоялец
Постоялец
 
Сообщения: 346
Зарегистрирован: 09.08.2004 (Пн) 16:11

Сообщение Dex » 01.01.2005 (Сб) 12:03

Мне нужно не много не это в етой функции папки пишутся типа так:
..[windows], и файла добавляются, а мне нужно токо папки и типа такого плана:
С:\
C:\Windows
C:\Windows\System
... :)

XairOn
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 324
Зарегистрирован: 19.07.2004 (Пн) 20:20
Откуда: Irkutsk region

Сообщение XairOn » 01.01.2005 (Сб) 12:27

Тебе нужно получить дерево каталогов?

Dex
Постоялец
Постоялец
 
Сообщения: 346
Зарегистрирован: 09.08.2004 (Пн) 16:11

Сообщение Dex » 01.01.2005 (Сб) 13:22

Ну типа да!?

GM
programador
programador
 
Сообщения: 1427
Зарегистрирован: 24.06.2003 (Вт) 15:56
Откуда: 194.67.52.100

Сообщение GM » 01.01.2005 (Сб) 15:24

Dex писал(а):Ну типа да!?
Так бы и сразу сказал, а то сначала пришлось разделение и уровни делать.
А вообще-то нужно было всего-то несколько строчек изменить.
Код: Выделить всё
'На форме List1
Private Declare Function GetFileAttributes Lib "kernel32" Alias "GetFileAttributesA" (ByVal lpFileName As String) As Long
Const FILE_ATTRIBUTE_DIRECTORY = &H10

Private Declare Function FindFirstFile Lib "kernel32" Alias "FindFirstFileA" (ByVal lpFileName As String, lpFindFileData As WIN32_FIND_DATA) As Long
Private Declare Function FindNextFile Lib "kernel32" Alias "FindNextFileA" (ByVal hFindFile As Long, lpFindFileData As WIN32_FIND_DATA) As Long
Private Declare Function FindClose Lib "kernel32" (ByVal hFindFile As Long) As Long
Private Type FILETIME
    dwLowDateTime As Long
    dwHighDateTime As Long
End Type
Const MAX_PATH = 260
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
Function StripNulls(OriginalStr As String) As String
    If (InStr(OriginalStr, Chr(0)) > 0) Then
        OriginalStr = Left(OriginalStr, InStr(OriginalStr, Chr(0)) - 1)
    End If
    StripNulls = OriginalStr
End Function

Function EnumDirs(path As String)
Dim sName As String, sSpace As String
Dim hSearch  As Long, bIsDirectory As Boolean
Dim Cont As Integer
On Error GoTo exitfromhere
If Right(path, 1) <> "" Then path = path & ""
    Dim WFD As WIN32_FIND_DATA
    Cont = True
    hSearch = FindFirstFile(path & "*", WFD)
If hSearch <> -1 Then
        Do While Cont
       sName = StripNulls(WFD.cFileName)
       
If sName <> "." And sName <> ".." Then
If GetFileAttributes(path & sName) And FILE_ATTRIBUTE_DIRECTORY Then
List1.AddItem (path & sName)
EnumDirs path & sName
End If
End If
Cont = FindNextFile(hSearch, WFD)
       
        Loop
End If
        Cont = FindClose(hSearch)
exitfromhere:
End Function

З.Ы. Вот наконец-то и я научился делать рекурсии :)
الفيجوال بيسك الرابح

Dex
Постоялец
Постоялец
 
Сообщения: 346
Зарегистрирован: 09.08.2004 (Пн) 16:11

Сообщение Dex » 01.01.2005 (Сб) 21:11

GM вооще классно спасибо.А я сегодня пытался сделать сам через
Private Declare Function SHBrowseForFolder Lib "Shell32" Alias "SHBrowseForFolderA" (lpBrowseInfo As BROWSEINFO) As Long
ну и там ещё функцию писал, смог реализовать появление окошка а вот в ListBox занести хрен... 8)

Dex
Постоялец
Постоялец
 
Сообщения: 346
Зарегистрирован: 09.08.2004 (Пн) 16:11

Сообщение Dex » 01.01.2005 (Сб) 21:14

А как узнать существуют ли в указанной папки с указанным расширением и опять запихнуть ети файлы в ListBox :)

XairOn
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 324
Зарегистрирован: 19.07.2004 (Пн) 20:20
Откуда: Irkutsk region

Сообщение XairOn » 01.01.2005 (Сб) 22:41

Dex писал(а):А как узнать существуют ли в указанной папки с указанным расширением и опять запихнуть ети файлы в ListBox :)


Если FSO подойдет, то могу пример скинуть.

Dex
Постоялец
Постоялец
 
Сообщения: 346
Зарегистрирован: 09.08.2004 (Пн) 16:11

Сообщение Dex » 02.01.2005 (Вс) 0:12

XairOn спасибо я всё смог реализовать cам.Я сделал проще, не через FSO, а с помощью FileListBox (не надо думать что я не умею пользоваться FSO) 8)

GM
programador
programador
 
Сообщения: 1427
Зарегистрирован: 24.06.2003 (Вт) 15:56
Откуда: 194.67.52.100

Сообщение GM » 02.01.2005 (Вс) 8:20

Через FileListBox - медленно, особенно если много файлов, но для простых случаев подойдет.
الفيجوال بيسك الرابح

Dex
Постоялец
Постоялец
 
Сообщения: 346
Зарегистрирован: 09.08.2004 (Пн) 16:11

Сообщение Dex » 02.01.2005 (Вс) 11:18

А как реализовать очистку корзины?

xolod
Гуру
Гуру
 
Сообщения: 1162
Зарегистрирован: 15.01.2004 (Чт) 0:42
Откуда: Moscow

Сообщение xolod » 02.01.2005 (Вс) 11:36

Код: Выделить всё
Const SHERB_NOCONFIRMATION = &H1
Const SHERB_NOPROGRESSUI = &H2
Const SHERB_NOSOUND = &H4
Private Type ULARGE_INTEGER
  LowPart As Long
  HighPart As Long
End Type
Private Type SHQUERYRBINFO
  cbSize As Long
  i64Size As ULARGE_INTEGER
  i64NumItems As ULARGE_INTEGER
End Type
Private Declare Function SHEmptyRecycleBin Lib "shell32.dll" Alias "SHEmptyRecycleBinA" (ByVal hwnd As Long, ByVal pszRootPath As String, ByVal dwFlags As Long) As Long
Private Declare Function SHUpdateRecycleBinIcon Lib "shell32.dll" () As Long
Private Declare Function SHQueryRecycleBin Lib "shell32.dll" Alias "SHQueryRecycleBinA" (ByVal pszRootPath As String, pSHQueryRBInfo As SHQUERYRBINFO) As Long
Private Sub Form_Load()
    'KPD-Team 2000
    'URL: http://www.allapi.net/
    'E-Mail: KPDTeam@Allapi.net
    Dim RBinInfo As SHQUERYRBINFO, Msg As VbMsgBoxResult
    RBinInfo.cbSize = Len(RBinInfo)
    SHQueryRecycleBin vbNullString, RBinInfo
    If (RBinInfo.i64Size.LowPart And &H80000000) = &H80000000 Or RBinInfo.i64Size.HighPart > 0 Then
        Msg = MsgBox("Your Recycle Bin consumes over 2 gigabytes right now!" + vbCrLf + "Do you want to empty it?", vbYesNo + vbQuestion)
    Else
        Msg = MsgBox("Your Recycle Bin consumes" + Str$(RBinInfo.i64Size.LowPart) + " bytes right now." + vbCrLf + "Do you want to empty it?", vbYesNo + vbQuestion)
    End If
    If Msg = vbYes Then
        SHEmptyRecycleBin Me.hwnd, vbNullString, 0
        SHUpdateRecycleBinIcon
    End If
End Sub

Constant ERROR_SUCCESS deprecated. I'm so happy.
Программирование и дизайн – http://www.macrointellect.ru

Dex
Постоялец
Постоялец
 
Сообщения: 346
Зарегистрирован: 09.08.2004 (Пн) 16:11

Сообщение Dex » 02.01.2005 (Вс) 11:38

xolod спасибо отлично работает! :)

Dex
Постоялец
Постоялец
 
Сообщения: 346
Зарегистрирован: 09.08.2004 (Пн) 16:11

Сообщение Dex » 02.01.2005 (Вс) 20:38

Как в ListBox реализовать веделение элементов? :)

A.A.Z.
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3035
Зарегистрирован: 30.06.2003 (Пн) 13:38

Сообщение A.A.Z. » 02.01.2005 (Вс) 20:42

List1.Selected(Index) = True
Для выделения нескольких эл-тов необходимо MultiSelect = True

Dex
Постоялец
Постоялец
 
Сообщения: 346
Зарегистрирован: 09.08.2004 (Пн) 16:11

Сообщение Dex » 02.01.2005 (Вс) 21:42

А как удалить в ListBox'е выделенные элементы? :shock:

A.A.Z.
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3035
Зарегистрирован: 30.06.2003 (Пн) 13:38

Сообщение A.A.Z. » 02.01.2005 (Вс) 22:05

Ну...
Код: Выделить всё
Dim I&
For I = 0 To List1.ListCount - 1
If List1.Selected(I) = True Then List1.RemoveItem I
Next
Например, так :roll:

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 02.01.2005 (Вс) 22:24

AAZ, у тебя будет выход за последний элемент, потому что ListCount вычисляется только один раз - в начале цикла. Лучше так:
Код: Выделить всё
Dim I&
For I = List1.ListCount - 1 To 0 Step -1
    If List1.Selected(I) = True Then List1.RemoveItem I
Next
Изображение

A.A.Z.
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3035
Зарегистрирован: 30.06.2003 (Пн) 13:38

Сообщение A.A.Z. » 02.01.2005 (Вс) 22:31

Да, точно, ты прав :oops:

Dex
Постоялец
Постоялец
 
Сообщения: 346
Зарегистрирован: 09.08.2004 (Пн) 16:11

Сообщение Dex » 03.01.2005 (Пн) 12:49

А как узнать путь системной папки? :)

XairOn
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 324
Зарегистрирован: 19.07.2004 (Пн) 20:20
Откуда: Irkutsk region

Сообщение XairOn » 03.01.2005 (Пн) 12:53

А как узнать путь системной папки?

Вот так:
Код: Выделить всё
Environ("windir")

Dex
Постоялец
Постоялец
 
Сообщения: 346
Зарегистрирован: 09.08.2004 (Пн) 16:11

Сообщение Dex » 03.01.2005 (Пн) 18:01

Дапустим у меня есть два файла:
C:\WINDOWS\Рабочий стол\File.fle
C:\WINDOWS\Рабочий стол\~File.fle
Подключаю FSO и обьявляю
Dim fso As New FileSystemObject
Далее пишу
fso.DeleteFile "C:\WINDOWS\Рабочий стол\File.fle"
fso.DeleteFile "C:\WINDOWS\Рабочий стол\~File.fle"
Так вот файл: File.fle удаляется, а вот: ~File.fle не удаляется и выдаёт ошибку.
Почему и что мне делать чтоб удалить етот файл? :?

A.A.Z.
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3035
Зарегистрирован: 30.06.2003 (Пн) 13:38

Сообщение A.A.Z. » 03.01.2005 (Пн) 18:19

~File.fle, наверное, имеет какие-нибудь аттрибуты - скрытый / только чтение... :roll:
Попробуй
Код: Выделить всё
FSO.DeleteFile "C:\Windows\Рабочий стол\~File.fle", True

Dex
Постоялец
Постоялец
 
Сообщения: 346
Зарегистрирован: 09.08.2004 (Пн) 16:11

Сообщение Dex » 03.01.2005 (Пн) 18:29

Что File.fle, что ~File.fle имеют атрибуты архивные.Но строчка всё
Код: Выделить всё
FSO.DeleteFile "C:\Windows\Рабочий стол\~File.fle", True
всё равно не помогает. Мозет каким другим способом мозно удалить? :)

A.A.Z.
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3035
Зарегистрирован: 30.06.2003 (Пн) 13:38

Сообщение A.A.Z. » 03.01.2005 (Пн) 18:36

А не через прогу файл удаляется? Может, он просто занят другой прогой? :roll:

Dex
Постоялец
Постоялец
 
Сообщения: 346
Зарегистрирован: 09.08.2004 (Пн) 16:11

Сообщение Dex » 03.01.2005 (Пн) 19:45

Не... Мозет дело вот в етом ~? :?

A.A.Z.
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3035
Зарегистрирован: 30.06.2003 (Пн) 13:38

Сообщение A.A.Z. » 03.01.2005 (Пн) 20:37

Да вряд ли... А он просто не удаляет или ошибку какую пишет? :roll:
Попробуй
Код: Выделить всё
Kill "C:\Windows\Рабочий стол\~File.fle"

Dex
Постоялец
Постоялец
 
Сообщения: 346
Зарегистрирован: 09.08.2004 (Пн) 16:11

Сообщение Dex » 03.01.2005 (Пн) 20:53

А Kill вооще ничего не удаляет. Fake!!!

След.

Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: Yandex-бот и гости: 16

    TopList