Список каталогов
GetLogicalDrives - Bit position 0 (the least-significant bit) is drive A, bit position 1 is drive B, bit position 2 is drive C, and so on
список каталогов
Это в смысле папок?
local memory:DWORD
local search_handle:DWORD
invoke GlobalAlloc,GMEM_FIXED or GMEM_ZEROINIT,1000h
mov memory,eax
.data
lpFileName db "*.*",0h
.code
invoke FindFirstFile,offset lpFileName,memory
mov search_handle,eax
again:
invoke FindNextFile,search_handle,memory
.if eax != 0h
jmp again
.endif
invoke GlobalFree,memory
;invoke ExitProcess,0h
ret
my_find endp
lpFileName db "*.*",0h - все файлы, а если lpFileName db "*",0h , то так, наверное, будут перечисляться все папки...
+Отфильтруй "." и ".."...
Ну и всё!!!
Вот код на Delphi:
if win32.dwFileAttributes=win32.dwFileAttributes and (FILE_ATTRIBUTE_DIRECTORY or LOCALE_SMONDECIMALSEP or LOCALE_INEGNUMBER) then
Memo1.Lines.Add('1) '+win32.cFileName);
i:=1;
while FindNextFile(hFile, win32) do
if win32.dwFileAttributes=win32.dwFileAttributes and (FILE_ATTRIBUTE_DIRECTORY or LOCALE_SMONDECIMALSEP or LOCALE_INEGNUMBER) then begin
inc(i);
Memo1.Lines.Add(inttostr(i)+') '+win32.cFileName);
end;
Кстати, на заметку, есть ещё WinAPI функции для перечисления папок:
DlgDirList
но они привязаны к ComboBox и ListBox.
Зачем нужны LOCALE_SMONDECIMALSEP и LOCALE_INEGNUMBER не знаю...
Никогда ими не пользовался...
{
char ch_mask[2] = "\\";
char way[0x500];
if(!((lstrcmp(win32_data,".")==0)|(lstrcmp(win32_data,"..")==0)))
{
lstrcpy(way,my_dir);
lstrcpy(way+lstrlen(way),win32_data);
if (att == FILE_ATTRIBUTE_DIRECTORY)
{
lstrcpy(way+lstrlen(way),ch_mask);
MyFind(way);
}
SomeFunction(way);
}
}
void MyFind(char* my_dir)
{
int i,boo;
WIN32_FIND_DATA win32_data;
char mask[4] = "*.*";
char this_my_dir[0x400];
lstrcpy(this_my_dir,my_dir);
lstrcpy(this_my_dir+lstrlen(my_dir),mask);
HANDLE findhan = FindFirstFile(this_my_dir,&win32_data);
if (findhan != INVALID_HANDLE_VALUE)
{
check(win32_data.cFileName,my_dir,win32_data.dwFileAttributes);
for (i=0;i<0x4fffffff;i++)
{
boo = FindNextFile(findhan,&win32_data);
if (boo == 0) {break;}
check(win32_data.cFileName,my_dir,win32_data.dwFileAttributes);
}
FindClose(findhan);
}
}
void My(char* my_string)
{
int i,strpointer;
unsigned int ch;
strpointer = 0;
for (i=1;i<=1000;i++)
{
ch = GetDriveType(my_string + strpointer);
if (ch == 1) {break;}
if (ch == DRIVE_FIXED)
{
MyFind(my_string+strpointer);
}
strpointer = i*4;
}
}
void MyOk()
{
...
...
char my_disk_string[0x400];
...
...
...
GetLogicalDriveStrings(sizeof(my_disk_string),my_disk_string);
My(my_disk_string);
}
...
if (att == FILE_ATTRIBUTE_DIRECTORY)
...
Я бы сделал так:
MSDN вообще не предусматривает наличие этих "флагов" в WIN32_FIND_DATA::dwFileAttributes. Раз. Это и не флаги, а константы - два. LOCALE_SMONDECIMALSEP - символ, используемый для выделения дробной части числа (в нашем случае - "," , у буржуев - "."); LOCALE_INEGNUMBER - константа, задающая формат представления отрицательных чисел. Обе эти константы используются при вызове Get/SetLocaleInfo(). Вопрос: откуда взят код?
Никакую. Вот определение этих констант:
[SIZE=2][COLOR=#0000ff]#define[/COLOR][/SIZE][SIZE=2] LOCALE_SMONDECIMALSEP 0x00000016 [/SIZE]
[SIZE=2]//файл winnt.h:[/SIZE]
[SIZE=2][COLOR=#0000ff]#define[/COLOR][/SIZE][SIZE=2] FILE_ATTRIBUTE_HIDDEN 0x00000002 [/SIZE]
[SIZE=2][COLOR=#0000ff]#define[/COLOR][/SIZE][SIZE=2] FILE_ATTRIBUTE_SYSTEM 0x00000004 [/SIZE]
[SIZE=2][COLOR=#0000ff]#define[/COLOR][/SIZE][SIZE=2] FILE_ATTRIBUTE_DIRECTORY 0x00000010 [/SIZE]
Поэтому:
FILE_ATTRIBUTE_HIDDEN | FILE_ATTRIBUTE_SYSTEM | FILE_ATTRIBUTE_DIRECTORY == LOCALE_SMONDECIMALSEP
Абсолютно согласен! Это было чистой воды совпадение! Но можно было бы использовать только одну константу LOCALE_SMONDECIMALSEP вместо 3-х! :)
Большое всем мерси!
Для перечисления всех директорий достаточно FILE_ATTRIBUTE_DIRECTORY - у всех директорий этот флаг будет выставлен.
Увы и Ах! Нужно ещё задать и другие константы! Если указать только FILE_ATTRIBUTE_DIRECTORY, то такие папки, как "System Volume Information" и "Recycled" не будут добавлены в список перечисленных папок; тоже самое касается и папки "Program Files". Вот поэтому мы дополнительно включаем константу FILE_ATTRIBUTE_HIDDEN для папок- "System Volume Information" и "Recycled", а для папки "Program Files"- FILE_ATTRIBUTE_READONLY (без этой константы последняя будет отсутствовать).
А Вы уверены, что результат выполнения
будет булевского типа?
Этот код выводит список папок, находящихся в корне диска С:
[SIZE=2]HANDLE hFind = FindFirstFile([/SIZE][SIZE=2][COLOR=#800000]"C:\\*.*"[/COLOR][/SIZE][SIZE=2], &fd);[/SIZE]
[SIZE=2][COLOR=#0000ff]do[/COLOR][/SIZE]
[SIZE=2]{[/SIZE]
[SIZE=2][COLOR=#0000ff] if[/COLOR][/SIZE][SIZE=2](fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)[/SIZE]
[SIZE=2] std::cout<<fd.cFileName<<std::endl; [/SIZE]
[SIZE=2]}[/SIZE][SIZE=2][COLOR=#0000ff]while[/COLOR][/SIZE][SIZE=2](FindNextFile(hFind, &fd));[/SIZE]
Если в аттрибутах стоит флаг FILE_ATTRIBUTE_DIRECTORY, то уже не важно какие еще аттрибуты она имеет - это уже директория.
Тут работает не булева алгебра, а побитовое сложение.
Как раз-таки здесь мы наблюдаем булеву алгебру чистой воды. Просто операция выполняется не над двумя конкретными значаниями, а над их множеством. Побитовое сложение суть "исключающее или", а операция "и" - это объединение двух множеств, и к сложению она имеет весьма посредственное отношение (если не сказать "никакого").
Может я не правильно выразился, поясняю свою мысль:
(DWORD) && (DWORD) - результат (BOOL)
(DWORD) & (DWORD) - результат (DWORD)
Оч даже прокатит. Ты сначала попробуй, потом утверждай. Можешь даже сразу n := 21 Or 45 для спортивного интереса.
(DWORD) && (DWORD) - результат (BOOL)
(DWORD) & (DWORD) - результат (DWORD)
Да, тот факт, что в паскале для Integer при проведении логических операций используются одни и те же ключевые слова (Or/Xor/Not/And), что и для Boolean, многих сбивает с толку.
На код:
...
if find_Data.dwFileAttributes and FILE_ATTRIBUTE_DIRECTORY then begin
//добавляем папку в TreeViewer
end;
компилятор Borland Delphi ругнётся "Type of expression must be BOOLEAN" или же "Тип выражения должен быть логическим". Здесь нужно либо применить явное преобразование типа следующим образом:
//добавляем папку в TreeViewer
end;
либо писать так:
//добавляем папку в TreeViewer
end;
либо так:
//добавляем папку в TreeViewer
end;
Все, подчёркиваю, все папки, расположенные в корневом каталоге ищутся только при наличии констант FILE_ATTRIBUTE_HIDDEN и FILE_ATTRIBUTE_READONLY. По логике вещей, действительно, достаточно только одной константы для папок- FILE_ATTRIBUTE_DIRECTORY, но практика показывает, что одной её мало...