Аналог досовского DIR

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

Аналог досовского DIR

Сообщение Cav » 14.07.2003 (Пн) 20:04

Есть ли аналог досовского DIR'а в VB или через API?
У меня есть адрес папки - надо узнать все файлы(включая папки) в этом каталоге.
Я так и не понял как работает функция DIR в VB, по моему она просто проверяет файл на существование, возвращая его имя.
Пожалуйста, не предлогайте использовать dirlistbox и filelistbox - мне нужна скорость, а не тормоза контролов.
Заранее благодарен!

mad_Max
Бывалый
Бывалый
 
Сообщения: 203
Зарегистрирован: 15.09.2002 (Вс) 21:17
Откуда: Russia, Cherepovets

Сообщение mad_Max » 14.07.2003 (Пн) 22:56

Dir в VB работает так:
Сначала вызываешь функцию с параметрами, а потом в цикле вызываешь её без параметров пока она не вернёт пустое значение.
Пример: (заполняет ListBox файлами из корневого каталога C:)
Код: Выделить всё
dim strFileName as string
strFileName = Dir("C:\*.*")
While strFileName <> ""
ListBox.AddItem strFileName
strFileName=Dir
Wend

Cav
Новичок
Новичок
 
Сообщения: 44
Зарегистрирован: 14.07.2003 (Пн) 19:25

Сообщение Cav » 15.07.2003 (Вт) 9:06

Огромное спасибо!
P.S Если кому тоже понадобится - для директорий + файлы надо писать так: Dir("C:\*.*", vbDirectory)

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4160
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Сообщение Mikle » 15.07.2003 (Вт) 10:05

Заполнять ListBox файлами в цикле с помощью DIR...? А чем не устраивает уже имеющийся FileListBox?

Cav
Новичок
Новичок
 
Сообщения: 44
Зарегистрирован: 14.07.2003 (Пн) 19:25

Сообщение Cav » 15.07.2003 (Вт) 11:42

Это всего лишь пример, я же буду использовать массив.

Calvin
Постоялец
Постоялец
 
Сообщения: 409
Зарегистрирован: 21.01.2003 (Вт) 12:13
Откуда: Sebastopol

Сообщение Calvin » 15.07.2003 (Вт) 12:00

Очень вовремя затронута тема про Dir$. У меня вопрос:
Я вот, допустим, не циклом извлекаю содержимое директорий, а таймером (хотя тут разницы никакой нет) и изменяю значение Label. У меня дома 98 винда, а на работе 2000. Вот мой код (я тут "по кругу" гоняю Dir$ в директории C:\WINNT\)
Код: Выделить всё
Public f, p
Private Sub Form_Load()
f = Dir$("C:\WINNT\")
End Sub

Private Sub Timer1_Timer()
f = Dir$
Label2 = "C:\WINNT\" & f
' On Error Resume Next   <---приходится в 2000-м применять это
  If Dir$ = "" Then
    f = Dir$("C:\WINNT\")
  End If

В коде If Dir$ = "" Then я заново обращаюсь к Dir$ и вроде бы все правильно, что должна быть ошибка, когда все файлы и папки "исчерпаны", но 98-я винда не ругается, почему?
У меня еще параллельно вопрос: как выводить полный путь файлов, выводимых Dir$-ом?
-Whose the motocycle, is this? -It`s a chopper, baby! -Whose chopper is this? -Zed`s! -Who is Zed? -Zed`s dead, baby, Zed`s dead! :-D

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

Сообщение skiperski » 15.07.2003 (Вт) 12:44

Я не знаю почему в 98-х не вылетает ошибка, зато знаю почему она появляется под 2000-ми. И хочу тебя расстроить: твой код показывет (если ты оптимист) или не показывает (если ты пессимист) ровно половину имеющихся файлов.

Пока не буду выдавать эту страшную тайну :) Надеюсь сам заметишь и разберёшся.

Calvin
Постоялец
Постоялец
 
Сообщения: 409
Зарегистрирован: 21.01.2003 (Вт) 12:13
Откуда: Sebastopol

Сообщение Calvin » 15.07.2003 (Вт) 12:50

я согласен, так как критерий в данном случае по умолчанию vbNormal
и папки с другими файлами (скрытыми и т.д.) не отобразятся
ЗЫ: а как на счет полного пути?
-Whose the motocycle, is this? -It`s a chopper, baby! -Whose chopper is this? -Zed`s! -Who is Zed? -Zed`s dead, baby, Zed`s dead! :-D

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

Сообщение skiperski » 15.07.2003 (Вт) 13:18

Calvin писал(а):я согласен, так как критерий в данном случае по умолчанию vbNormal
и папки с другими файлами (скрытыми и т.д.) не отобразятся

Хе-хе, не угадал! Ровно половина от тех что ты думаешь. У тебя в коде логическая ошибка. Найдёшь её - решишь проблему с программной ошибкой.

Calvin писал(а):ЗЫ: а как на счет полного пути?

Ты же при первом вызове путь задаёшь? Задаёшь. Какой тебе ещё кроме него нужен?

Calvin
Постоялец
Постоялец
 
Сообщения: 409
Зарегистрирован: 21.01.2003 (Вт) 12:13
Откуда: Sebastopol

Сообщение Calvin » 15.07.2003 (Вт) 13:46

Ну если бы можно было бы сделать так (не проверял):
Код: Выделить всё
Private Sub Timer1_Timer()
if Dir$+1="" then  :lol:  :wink:
   f = Dir$
   f = Dir$("C:\WINNT\")
  else
   f = Dir$
end if
Label2 = "C:\WINNT\" & f

а вообще чегойто я торможу и не могу понять где я пропарился

ЗЫ А по поводу полного пути, то меня интересует функция, которая выводит полный путь.....
-Whose the motocycle, is this? -It`s a chopper, baby! -Whose chopper is this? -Zed`s! -Who is Zed? -Zed`s dead, baby, Zed`s dead! :-D

GoGosha
Постоялец
Постоялец
 
Сообщения: 642
Зарегистрирован: 02.08.2002 (Пт) 9:14
Откуда: Russia

Сообщение GoGosha » 15.07.2003 (Вт) 14:40

Зато такой кож работает

Код: Выделить всё
Public f

Private Sub Form_Load()
    f = Dir$("E:\WINNT\")
End Sub

Private Sub Timer1_Timer()
    f = Dir
    If Len(f) > 0 Then
        Label2 = "E:\winnt\" & f
    Else
        Timer1.Enabled = False
    End If
End Sub

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

Сообщение skiperski » 15.07.2003 (Вт) 14:54

Ладно, давай проведём разбор полётов. Смотрим в начало топика: человек интересуется как работает функция Dir(). mad_Max ему объясняет и даже приводит пример. Возражений по поводу объяснений не последовало, а даже наоборот - mad_Max получил в свой адрес сеньку. Стало быть, описание алгоритма работы примем как верное.

Поехали дальше
mad_Max писал(а):Dir в VB работает так:
Сначала вызываешь функцию с параметрами, а потом в цикле вызываешь её без параметров пока она не вернёт пустое значение.

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

Form_Load() трогать не будем, там всё нормально, а вот Timer1_Timer() прокомментирую:
Код: Выделить всё
f = Dir$ '1.получаем имя следующего файла
  Label2 = "C:\WINNT" & f 'здесь всё понятно
' On Error Resume Next   <---приходится в 2000-м применять это
  If Dir$ = "" Then '2.получаем имя следующего файла!!!!!!!!!
    f = Dir$("C:\WINNT")
  End If

Т.е. имя файла ты получаешь дважды, а пишешь в Label лишь единожды! Причём имя первого файла, полученное в Form_Load() тоже пропадает. Теперь смотрим откуда растут ноги у ошибки выполнения: а от туда же. Если при первом вызове Dir() вернёт уже пустую строку (нечётное кол-во файлов в дирректории), то следующий вызов (строка с комментарием 2, там где проверка) уже вызовет ошибку. А под 98-ми просто кол-во файлов могло оказаться чётным.

Надеюсь этого достаточно для приведения алгоритма в рабочий вид?

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

Сообщение skiperski » 15.07.2003 (Вт) 14:56

GoGosha писал(а):Зато такой кож работает

Значение первого вызова бесследно пропало (см. предыдущее сообщение).

GoGosha
Постоялец
Постоялец
 
Сообщения: 642
Зарегистрирован: 02.08.2002 (Пт) 9:14
Откуда: Russia

Сообщение GoGosha » 15.07.2003 (Вт) 15:00

skiperski писал(а):
GoGosha писал(а):Зато такой кож работает

Значение первого вызова бесследно пропало (см. предыдущее сообщение).


Да но зато количество файлов увеличилось и не просто, а в 2 - 1/n , (где n - колво файлов) раз. а в форм_лоаде приписать надо
Label2 = "E:\winnt" & f

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

Сообщение skiperski » 15.07.2003 (Вт) 15:44

GoGosha писал(а):Да но зато количество файлов увеличилось и не просто, а в 2 - 1/n , (где n - колво файлов) раз

И не просто, а очень просто - ровно в два раза.

ЗЫ: Такой простой вопрос, а столько уже понаписывалось!

Calvin
Постоялец
Постоялец
 
Сообщения: 409
Зарегистрирован: 21.01.2003 (Вт) 12:13
Откуда: Sebastopol

Сообщение Calvin » 15.07.2003 (Вт) 15:44

Может я неправильно выразился, но что-то я не совсем опять понял. Вот что я думаю:
В процедуре Load
я первоначально вызвал Dir$ со всеми параметрами (единственная ошибка на мой взгляд то, что мне сначала нужно было бы присвоить Лэйбэлу значение f, т.к. при первичном вызове функции Dir$ со всеми параметрами определяется первый элемент директории), а то у меня до этого было так:

Private Sub Form_Load()
f = Dir$("C:\WINNT\")
End Sub

Private Sub Timer1_Timer()
f = Dir$
Label2 = "C:\WINNT\" & f
надо поменять их местами
' On Error Resume Next <---приходится в 2000-м применять это
If Dir$ = "" Then
f = Dir$("C:\WINNT\")
End If
а вот последние три строки означали то, что когда отображены все элементы директории и функция Dir$ = "", то я заново присваиваю ей первый элемент с теми же параметрами и продолжается та же песня в этой же дирректории. А таймер у меня и является циклом - какая разница чем перебирать
-Whose the motocycle, is this? -It`s a chopper, baby! -Whose chopper is this? -Zed`s! -Who is Zed? -Zed`s dead, baby, Zed`s dead! :-D

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

Сообщение skiperski » 15.07.2003 (Вт) 15:50

Да ты чего? Издеваисси что ли?

Тебе уже только я уже третий раз пишу где ошибка, даже строчку показал, даже пример тебе для тебя за тебя уже написали, а ты всё о своём. Сравнивать надо не функцию, а строковую переменную!!! Т.к. при !!!каждом!!! (ну как ещё выделить?) вызове Dir() меняется её значение.

Calvin
Постоялец
Постоялец
 
Сообщения: 409
Зарегистрирован: 21.01.2003 (Вт) 12:13
Откуда: Sebastopol

Сообщение Calvin » 15.07.2003 (Вт) 15:58

ДА ТОРМОЗ Я - ВОТ КТО :oops: ни ума ни фантазии....спасибо (я извиняюсь, что "намусорил" в форуме)
а как на счет функции полного пути?


НУ БЛИН ВЫ ДАЕТЕ, ЧТОЖ Я СОВСЕМ ТОРМОЗ (КОНЕЧНО СПАСИБО ЗА ОТВЕТЫ И ЗА ПОМОЩЬ), НО Я СПРАШИВАЮ НЕ ПРИМЕНИТЕЛЬНО ЭТОГО ПРИМЕРА А ВООБЩЕ ПРО ЭТУ ФУНКЦИЮ - ПУСКАЙ ЭТО БУДЕТ ФУНКЦИЯ ПОИСКА "АДРЕССА" КАКОГО-ЛИБО ФАЙЛА ИЛИ ПАПКИ) :evil: ...........не охота засорять топик новым постом, блин
Последний раз редактировалось Calvin 15.07.2003 (Вт) 19:55, всего редактировалось 2 раз(а).
-Whose the motocycle, is this? -It`s a chopper, baby! -Whose chopper is this? -Zed`s! -Who is Zed? -Zed`s dead, baby, Zed`s dead! :-D

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

Сообщение skiperski » 15.07.2003 (Вт) 16:12

Calvin писал(а):а как на счет функции полного пути?

Не, точно издеваисся!

Давай порассуждаем вместе. Есть какое-то произвольное имя файла, например, "seek.me". Теперь мы - операционная система. У нас задание выдать полный путь к этому "seek.me". Какие мысли, уважаемый сопроцессор? А чё тут думать - прыгать надо! Т.е. искать. А хде? А везде! А сколько их надо найти? А один-единственный! А хде он лежит?!!

Собственно, на этом инсценировку можно и закончить.

GoGosha
Постоялец
Постоялец
 
Сообщения: 642
Зарегистрирован: 02.08.2002 (Пт) 9:14
Откуда: Russia

Сообщение GoGosha » 15.07.2003 (Вт) 17:01

a = Dir(b)

If Right(b,1) <> "\" then
Path=b & "\" & a
else
Path=b & a
End if


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

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

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

    TopList