Поиск файлов по расширениям

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Daddy
Начинающий
Начинающий
 
Сообщения: 17
Зарегистрирован: 24.10.2003 (Пт) 10:37

Поиск файлов по расширениям

Сообщение Daddy » 24.10.2003 (Пт) 10:40

С чего начать?
разобраться бы с FAT для начала.

moderator
Модератор
Модератор
 
Сообщения: 1896
Зарегистрирован: 10.12.2001 (Пн) 18:11
Откуда: Украина, Харьков

Re: Поиск файлов по расширениям

Сообщение moderator » 24.10.2003 (Пт) 10:56

Daddy писал(а):С чего начать?
разобраться бы с FAT для начала.


Причем тут FAT к поиску?
Модератор
http://www.vbstreets.ru / moderator@vbstreets.ru

... Почетные награды: [*], [+], [!]. Все еще впереди...

skiperski
Идеолог
Идеолог
Аватара пользователя
 
Сообщения: 1386
Зарегистрирован: 25.06.2002 (Вт) 15:52

Сообщение skiperski » 24.10.2003 (Пт) 12:30

Код: Выделить всё
Option Explicit

Public Function test()
   
    Dim FolderPath As String
    Dim FileName As String
   
    FolderPath = "d:\1\"
    FileName = Dir$(FolderPath & "*.ini")
    Do While (Len(FileName))
        Debug.Print FileName
        FileName = Dir$()
    Loop
   
End Function
[/code]

Daddy
Начинающий
Начинающий
 
Сообщения: 17
Зарегистрирован: 24.10.2003 (Пт) 10:37

Сообщение Daddy » 24.10.2003 (Пт) 14:49

это только в одной папке проверит.
Мне не понятен способ как автоматичекси можно все файлы проверить,
ТОсеть все на диске.Точнее обратиться ко всем.
Я же струк туру диска незнаю и программа тоже.
Или вы имеете в виду,вместо FolderPath функцию создать.
Вот о ней и речь,в принципе,все дерево увидеть

Daddy
Начинающий
Начинающий
 
Сообщения: 17
Зарегистрирован: 24.10.2003 (Пт) 10:37

Re: Поиск файлов по расширениям

Сообщение Daddy » 24.10.2003 (Пт) 14:54

moderator писал(а):
Daddy писал(а):.


Причем тут FAT к поиску?

в FATe только перебором, в NTFS код наверное короче можно сделать

RayShade
Scarmarked
Scarmarked
Аватара пользователя
 
Сообщения: 5511
Зарегистрирован: 02.12.2002 (Пн) 17:11
Откуда: Russia, Saint-Petersburg

Сообщение RayShade » 24.10.2003 (Пт) 15:26

Daddy, небольшой совет - сначала думай, потом говори.

БЕЗ РАЗНИЦЫ КАКАЯ ФАЛОВАЯ СИСТЕМА!

API одно для всех. Так что хоть HPFS там будет, код не изменится от этого.



А перебор всех файлов на диске делается с помощью рекрусии.

То есть примерно так:



Код: Выделить всё
private fso as new scripting.filesystemobject
Private Sub EnumFolders(Path As String)
On Error GoTo errhdl
Dim fsl As Folder
Dim fsf1 As File
Dim ndx As Node
Dim ndx1 As Node
Set fsl = fso.GetFolder(Path & "\")
For Each fsl1 In fsl.SubFolders
Call EnumFolders(Path & "\" & fsl1.Name)
Next fsl1
For Each fsf1 In fsl.Files
list1.additem fsf1.name
Next fsf1
errhdl:
End Sub

Примечание - на форме д.б. Listbox с именем List1.
в Form_Load можно написать так:
Код: Выделить всё
private sub form_load()
enumfolders ("c:")
end sub

Daddy
Начинающий
Начинающий
 
Сообщения: 17
Зарегистрирован: 24.10.2003 (Пт) 10:37

Сообщение Daddy » 24.10.2003 (Пт) 19:49

RayShade писал(а):Daddy, небольшой совет - сначала думай, потом говори.
БЕЗ РАЗНИЦЫ КАКАЯ ФАЛОВАЯ СИСТЕМА!
API одно для всех. Так что хоть HPFS там будет, код не изменится от этого.



я имел ввиду , -у разных систем разная структура директорий.
у NTFS файлы как дерево,бинарное дерево располагаются,так,что поиск
наверное можно по другому организовать.
по этому выбор оптимального алгоритма будет зависеть от файловой системы.
Но не ето суть
знал бы не спрашивал
спасибо

Vellan
Обычный пользователь
Обычный пользователь
 
Сообщения: 90
Зарегистрирован: 06.05.2002 (Пн) 1:21
Откуда: Russia

Сообщение Vellan » 24.10.2003 (Пт) 21:17

А какая разница. Орнганизация то всё равно иерархическая. Вот выйдет Longhorn, тогда и будем SELECT и т.д. :)

Daddy
Начинающий
Начинающий
 
Сообщения: 17
Зарегистрирован: 24.10.2003 (Пт) 10:37

Сообщение Daddy » 25.10.2003 (Сб) 0:28

Vellan писал(а):А какая разница. Орнганизация то всё равно иерархическая. Вот выйдет Longhorn, тогда и будем SELECT и т.д. :)


ОПТИМАЛЬНЫЙ АЛГОРИТМ ,будет для разных систем свой.
давайте не будем не по сушеству

RayShade
Scarmarked
Scarmarked
Аватара пользователя
 
Сообщения: 5511
Зарегистрирован: 02.12.2002 (Пн) 17:11
Откуда: Russia, Saint-Petersburg

Сообщение RayShade » 27.10.2003 (Пн) 13:57

Форум посвящен VB. Этот язык не позволяет до такого низкого уровня опуститься, чтобы была заметна разница в физическом хранении информации о файлах и каталогах. Так что по существу разницы никакой.

oleg
Обычный пользователь
Обычный пользователь
 
Сообщения: 71
Зарегистрирован: 07.02.2002 (Чт) 1:41

Сообщение oleg » 06.11.2003 (Чт) 0:58

RayShade писал(а):Daddy, небольшой совет - сначала думай, потом говори.
БЕЗ РАЗНИЦЫ КАКАЯ ФАЛОВАЯ СИСТЕМА!
Код: Выделить всё
private fso as new scripting.filesystemobject
Private Sub EnumFolders(Path As String)
....
end sub

не получилось проверить,ошибка компиляции,ло ума довести
пример нехватило

Amed
Алфизик
Алфизик
 
Сообщения: 5346
Зарегистрирован: 09.03.2003 (Вс) 9:26

Сообщение Amed » 06.11.2003 (Чт) 7:57

А какая ошибка-то? Небось ты в Project|References на подключил Microsoft Scripting Runtime? :)

Cyrax
Cyberninja
Cyberninja
Аватара пользователя
 
Сообщения: 891
Зарегистрирован: 25.04.2002 (Чт) 21:20
Откуда: Magnitogorsk, Russia

Сообщение Cyrax » 06.11.2003 (Чт) 12:55

а можно и я свою лепту внесу?

FSO - это конечно карашо, но можно и более легкими средствами обойтись (между прочим уже имеющимися в языке). это я про функцию DIR.

вот тут лежит пример рекурсивной процедуры поиска файлов. нужно только задать начальную папку.
Ты это ему расскажи. Я уже пять болтов отвинтил, и конца не видно... (озадаченно) А это в какую сторону тянуть? Ну-ка... Ага, этот был лишний, этот вообще не отсюда, и этот... Точно, два болта.

Welcome to IRC

VBOSS
Начинающий
Начинающий
 
Сообщения: 8
Зарегистрирован: 04.11.2003 (Вт) 10:45

Сообщение VBOSS » 07.11.2003 (Пт) 13:43

Daddy это делается очень просто (деуствительно рукурсией)
FSO -тут тоже лушним будет, а самый 100% верный вариант с помощью API это делается примерно так:
На форму кйдаеш кнопку и вставляеш этот код
Option Explicit

Private Const INVALID_HANDLE_VALUE = -1
Private Const FILE_ATTRIBUTE_DIRECTORY = &H10
Private Const MAX_PATH = 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

Private Declare Function FindClose Lib "kernel32" (ByVal hFindFile As Long) As Long
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 GetInputState Lib "user32" () As Long

Dim i As Long
Dim Files() As String 'будущий массив

Private Sub cmd_Click()
Dim j As Long

SearchForFolders "C:\windows\", "*.txt" 'Path - указывает, в какой папке будем искать
'File - указывает, какой файл будем искать.
Print i & " файлов" 'печатает на форме общее число файлов
'далее выводим на форму содержимое массива
For j = LBound(Files) To UBound(Files)
Print Files(j)
Next j
End Sub

Private Sub SearchForFiles(fName As String, Path As String)
Dim Atr As Integer
Dim hFnd As Long
Dim str As String
Dim WFD As WIN32_FIND_DATA
hFnd = FindFirstFile(Path & fName, WFD) 'ищем первый файл
If hFnd = INVALID_HANDLE_VALUE Then Exit Sub
Do
str = TrimNull(WFD.cFileName)
Atr = (WFD.dwFileAttributes And FILE_ATTRIBUTE_DIRECTORY) 'узнаём, является
'ли найденный файл папкой
If str <> "." And str <> ".." Then
If Atr = 0 Then 'если это не папка
'переопределяем массив
ReDim Preserve Files(i)
'и записываем него путь и имя файла
Files(i) = Path & str
i = i + 1
End If
End If
Loop While FindNextFile(hFnd, WFD)
FindClose hFnd
End Sub

Private Sub SearchForFolders(Path As String, File As String)
Dim Atr As Integer
Dim hFnd As Long
Dim str As String
Dim WFD As WIN32_FIND_DATA 'тип в который будет скачиваться вся инфа о файле
hFnd = FindFirstFile(Path & "*", WFD) 'ищем первый подкаталог
If hFnd = INVALID_HANDLE_VALUE Then Exit Sub 'если подкаталог не найден, то выходим из функции
SearchForFiles File, Path 'вызывает ещё одну фнкцию для поиска файлов в папке
Do
str = TrimNull(WFD.cFileName)
'узнаём, является ли найденный файл папкой
Atr = (WFD.dwFileAttributes And FILE_ATTRIBUTE_DIRECTORY)
'если папка не является корневой на диске, то функция FindNextFile возвращает эти два значения
If str <> "." And str <> ".." Then
If Atr > 0 Then
If GetInputState() Then DoEvents
'Если файл является папкой, то снова вызываем функцию
'поиска подкаталогов в этой папке
SearchForFolders Path & str & "\", File
End If
End If
Loop While FindNextFile(hFnd, WFD) 'ищем следующий файл
FindClose hFnd 'освобождаем память
End Sub

Private Function TrimNull(Start As String) As String
Dim Pos As Integer
Pos = InStr(Start, Chr$(0))
If Pos Then
TrimNull = Left$(Start, Pos - 1)
Exit Function
End If
TrimNull = Start
End Function

посмотри там есть лишнии вещи (я из своей проги вырвал) и убери их.

Daddy
Начинающий
Начинающий
 
Сообщения: 17
Зарегистрирован: 24.10.2003 (Пт) 10:37

Сообщение Daddy » 12.11.2003 (Ср) 5:06

[quote="VBOSS"]Daddy это делается очень просто (деуствительно рукурсией)

For j = LBound(Files) To UBound(Files)

quote]
как мне надоела... invalid session...

Попробовал,чего то ищет,но если задать несушествующее расширение
то "выход за рамки"..-> сдесь
For j = LBound(Files) To UBound(Files)
происходит.
И подскажите,как переделать последний код,чтобы находил файлы
только с укзаным расширением,наприме задаю 3 буквы,а находит и по 5 и по 6 но первые совпадают,на каком этапе проверять длину расширения?

По поводу FSO,не работает код отчего то,подключил все как полагается.

спасибо

RayShade
Scarmarked
Scarmarked
Аватара пользователя
 
Сообщения: 5511
Зарегистрирован: 02.12.2002 (Пн) 17:11
Откуда: Russia, Saint-Petersburg

Сообщение RayShade » 12.11.2003 (Ср) 8:51

Зачем городить огород c API, если используя FSO можно написать код в три раза короче и в десять раз проще?

Отправляю в поиск по ключевому слову EnumFolder.

Daddy
Начинающий
Начинающий
 
Сообщения: 17
Зарегистрирован: 24.10.2003 (Пт) 10:37

Сообщение Daddy » 12.11.2003 (Ср) 15:14

RayShade писал(а):Daddy, небольшой совет - сначала думай, потом говори.
БЕЗ РАЗНИЦЫ КАКАЯ ФАЛОВАЯ СИСТЕМА!
API одно для всех. Так что хоть HPFS там будет, код не изменится от этого.

А перебор всех файлов на диске делается с помощью рекрусии.
То есть примерно так:

Код: Выделить всё
private fso as new scripting.filesystemobject
Private Sub EnumFolders(Path As String)
On Error GoTo errhdl
Dim fsl As Folder
Dim fsf1 As File
Dim ndx As Node
Dim ndx1 As Node
Set fsl = fso.GetFolder(Path & "")
For Each fsl1 In fsl.SubFolders
Call EnumFolders(Path & "" & fsl1.Name)
Next fsl1
For Each fsf1 In fsl.Files
list1.additem fsf1.name
Next fsf1
errhdl:
End Sub

Примечание - на форме д.б. Listbox с именем List1.
в Form_Load можно написать так:
Код: Выделить всё
private sub form_load()
enumfolders ("c:")
end sub


Подскажите что такое

Dim ndx As Node
Dim ndx1 As Node
Очень ругается на Nude
попробовал обозначить перемненные без AS,чегото раболтает,но все безбожно виснет,и хр рапортует об ошибке.
Я так понял все файлы на диске выдает?
Их же много!
может из за этого виснет?
И все таки ,как понять NODE?

мОжЕТ алгоритм опишите,по русски...
берем ..кладем..проверяем...???

skiperski
Идеолог
Идеолог
Аватара пользователя
 
Сообщения: 1386
Зарегистрирован: 25.06.2002 (Вт) 15:52

Сообщение skiperski » 12.11.2003 (Ср) 15:59

Просто этот пример выдран из программы и RayShade не почистил его. Эти переменные нигде не используются. Просто убери эти строчки.

Daddy
Начинающий
Начинающий
 
Сообщения: 17
Зарегистрирован: 24.10.2003 (Пт) 10:37

Сообщение Daddy » 12.11.2003 (Ср) 20:14

skiperski писал(а):Просто этот пример выдран из программы и RayShade не почистил его. Эти переменные нигде не используются. Просто убери эти строчки.

а насчет подвисания?
Когда код выполняеться все висниет.
Она не пердвигаються след оставляют за собой
Отчего так ресурсы жрет?

skiperski
Идеолог
Идеолог
Аватара пользователя
 
Сообщения: 1386
Зарегистрирован: 25.06.2002 (Вт) 15:52

Сообщение skiperski » 12.11.2003 (Ср) 20:53

Daddy писал(а):а насчет подвисания?

В For Each первой строчкой вставь DoEvents

Daddy писал(а):Когда код выполняеться все висниет.

Чего ж ты хочешь? Ты же весь диск сканируешь

Daddy писал(а):Она не пердвигаються след оставляют за собой

??? Моя твоя не понимай

Daddy писал(а):Отчего так ресурсы жрет?

Из-за рекурсии. Чем глубже вложение папок, тем больше ресурсов сжирает.

Saturn.65
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 543
Зарегистрирован: 13.10.2006 (Пт) 18:46

Сообщение Saturn.65 » 18.12.2007 (Вт) 9:27

Небольшой вопрос. Ищу файлы по маске. Нахожу. Помещаю в ListBox.
Как теперь мне совершить над ними определенное действие? Например переместить. скопировать или удалить? C одним файлом все понятно, а тут их целый список.
Код: Выделить всё
Private Sub Form_Load()
    Dim a() As String
    ScanForFiles "C:\", "*.tmp", a()
    For i = 0 To UBound(a())
        List1.AddItem a(i)
    Next
End Sub

Вот пример целиком:
Вложения
Поиск файлов по маске в подкаталогах.zip
Поиск файлов по маске в подкаталогах
(3.6 Кб) Скачиваний: 61

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 18.12.2007 (Вт) 9:36

По одному файлу и обрабатываешь.
Либо используешь API/FSO.
Lasciate ogni speranza, voi ch'entrate.


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

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

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

    TopList