Dir()

Язык Visual Basic на платформе .NET.

Модераторы: Ramzes, Sebas

Blacket
Начинающий
Начинающий
 
Сообщения: 4
Зарегистрирован: 08.05.2004 (Сб) 1:13
Откуда: Коломна

Dir()

Сообщение Blacket » 31.05.2004 (Пн) 22:30

Стокнулся с проблемой при использовании Dir()
Код: Выделить всё
  . . .
  sFolder = Dir(sPath & "\*", FileAttribute.Directory)
  cboFolder.Items.Add(sFolder)
  If sFolder = Nothing Then Exit Sub
  Do
    sFolder = Dir()
    If sFolder = Nothing Then Exit Do
    cboFolder.Items.Add(sFolder)
  Loop

В sPath содержится путь к папке, из которой мне нужно считать подпапки и занести их в ComboBox. Как и полагается, заносит. По идее, Dir без параметров должен повторять тот же запрос, что и с параметрами, что он и делает, но до поры. Как только кончатся подпапки, т.е, пункты, соответствующие указанным критериям, вызов Dir возвращает не положенный Nothing, а продолжает указывать всё, что лежало в папке по адресу sPath (в данном случае, zip-архивы), с последующим занесением в список?
Моя ошибка или глюк?

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

Сообщение mad_Max » 31.05.2004 (Пн) 23:18

Не вижу другого способа, кроме как проверять, является ли папкой очередной полученный String (папки идут подряд, поэтому как только встретим первый файл, цикл можно завершить)
Код: Выделить всё
        Dim tmpAttrib As FileAttribute
        sFolder = Dir(sPath, FileAttribute.Directory)
        cboFolder.Items.Add(sFolder)
        If sFolder = Nothing Then Exit Sub
        Do
            sFolder = Dir()
            If sFolder = Nothing Then Exit Do
            tmpAttrib = GetAttr(sPath & sFolder)
            If (tmpAttrib Or FileAttribute.Directory) <> tmpAttrib Then Exit Do
            cboFolder.Items.Add(sFolder)
        Loop

Здесь предполагается, что sPath заканчивается на "\".

corgi
ToyMan
ToyMan
 
Сообщения: 1367
Зарегистрирован: 01.10.2002 (Вт) 9:59
Откуда: Россия, Москва

Сообщение corgi » 31.05.2004 (Пн) 23:25

твоя ошибка :roll:
MSDN писал(а):Attributes
Optional. Enumeration or numeric expression whose value specifies file attributes. If omitted, returns files that match PathName, but have no attributes.

и даже пример есть :!: :
Код: Выделить всё
Dim MyFile, MyPath, MyName
' Returns "WIN.INI" if it exists.
MyFile = Dir("C:\WINDOWS\WIN.INI")   

' Returns filename with specified extension. If more than one *.INI
' file exists, the first file found is returned.
MyFile = Dir("C:\WINDOWS\*.INI")

' Call Dir again without arguments to return the next *.INI file in the
' same directory.
MyFile = Dir()

' Return first *.TXT file, including files with a set hidden attribute.
MyFile = Dir("*.TXT", vbHidden)

' Display the names in C:\ that represent directories.
MyPath = "c:"   ' Set the path.
MyName = Dir(MyPath, vbDirectory)   ' Retrieve the first entry.
Do While MyName <> ""   ' Start the loop.
      ' Use bitwise comparison to make sure MyName is a directory.
      If (GetAttr(MyPath & MyName) And vbDirectory) = vbDirectory Then
         ' Display entry only if it's a directory.
         Debug.WriteLine(MyName)
      End If   
   MyName = Dir()   ' Get next entry.
Loop
Ничто так не ограничивает полёт мысли программиста, как компилятор

Blacket
Начинающий
Начинающий
 
Сообщения: 4
Зарегистрирован: 08.05.2004 (Сб) 1:13
Откуда: Коломна

Сообщение Blacket » 06.06.2004 (Вс) 1:40

MSDN про значение vbDirectory параметра Directory:
Specifies directories or folders in addition to files with no attributes.

т.е. указывает папки вдобавок к файлам без атрибутов. Но в том-то и дело, что все прочие файлы имеют атрибут "только для чтения"!

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

Сообщение mad_Max » 06.06.2004 (Вс) 18:28

Еще в старом добром VB5 в хелпе было такое примечание к описанию функции Dir:
Calling Dir with the vbDirectory attribute does not continually return subdirectories,
т.е. прямо заявляют, что вызов Dir с параметром vbDirectory не будет постоянно возвращать имена поддиректорий. Видимо, функция с тех пор свое поведение не поменяла.


Вернуться в Visual Basic .NET

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

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 46

    TopList