Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Список каталогов

397
25 октября 2007 года
SergPas
527 / / 03.02.2007
Как средствами WinAPI получить список каталогов и список дисков?
367
26 октября 2007 года
Meatcoins
303 / / 18.01.2006
GetLogicalDriveStrings - c:\<null>d:\<null><null>
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

Цитата:

список каталогов


Это в смысле папок?

Код:
my_find proc
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 , то так, наверное, будут перечисляться все папки...
+Отфильтруй "." и ".."...
Ну и всё!!!
397
26 октября 2007 года
SergPas
527 / / 03.02.2007
Я assembler только начал изучать... ;) Но вот по использованию функций FindFirstFile и FindNextFile возникли вопросы... Так, например, при попытке отсортировать файлы и папки я использую константу FILE_ATTRIBUTE_DIRECTORY, чтобы указать, что в качестве искомых файлов выступают директории... Но этой константы не достаточно... Чтобы перечислить все папки на диске необходимо использовать ещё такие константы, как LOCALE_SMONDECIMALSEP и LOCALE_INEGNUMBER. Какую роль они играют при перечислении папок?
Вот код на Delphi:
 
Код:
hFile:=FindFirstFile('E:\*.*', win32);
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 функции для перечисления папок:
 
Код:
DlgDirListComboBox
DlgDirList

но они привязаны к ComboBox и ListBox.
367
27 октября 2007 года
Meatcoins
303 / / 18.01.2006
Я когда-то делал поиск всех папок с помощью рекурсии...
Зачем нужны LOCALE_SMONDECIMALSEP и LOCALE_INEGNUMBER не знаю...
Никогда ими не пользовался...
Код:
void check(char* win32_data,char* my_dir,DWORD att)
{
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);
}
6.4K
29 октября 2007 года
Host
122 / / 22.09.2005
Цитата: Meatcoins

...
if (att == FILE_ATTRIBUTE_DIRECTORY)
...


Я бы сделал так:

 
Код:
if(att & FILE_ATTRIBUTE_DIRECTORY)
534
29 октября 2007 года
HarryAxe
448 / / 19.01.2006
Цитата: SergPas
... Так, например, при попытке отсортировать файлы и папки я использую константу FILE_ATTRIBUTE_DIRECTORY, чтобы указать, что в качестве искомых файлов выступают директории... Но этой константы не достаточно... Чтобы перечислить все папки на диске необходимо использовать ещё такие константы, как LOCALE_SMONDECIMALSEP и LOCALE_INEGNUMBER. Какую роль они играют при перечислении папок?


MSDN вообще не предусматривает наличие этих "флагов" в WIN32_FIND_DATA::dwFileAttributes. Раз. Это и не флаги, а константы - два. LOCALE_SMONDECIMALSEP - символ, используемый для выделения дробной части числа (в нашем случае - "," , у буржуев - "."); LOCALE_INEGNUMBER - константа, задающая формат представления отрицательных чисел. Обе эти константы используются при вызове Get/SetLocaleInfo(). Вопрос: откуда взят код?

6.4K
29 октября 2007 года
Host
122 / / 22.09.2005
Цитата: SergPas
...Какую роль они играют при перечислении папок?



Никакую. Вот определение этих констант:

 
Код:
[SIZE=2]//файл winnls.h:[/SIZE]
[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
397
30 октября 2007 года
SergPas
527 / / 03.02.2007
Цитата:
FILE_ATTRIBUTE_HIDDEN | FILE_ATTRIBUTE_SYSTEM | FILE_ATTRIBUTE_DIRECTORY == LOCALE_SMONDECIMALSEP


Абсолютно согласен! Это было чистой воды совпадение! Но можно было бы использовать только одну константу LOCALE_SMONDECIMALSEP вместо 3-х! :)
Большое всем мерси!

6.4K
30 октября 2007 года
Host
122 / / 22.09.2005
Цитата: SergPas
...использовать только одну константу LOCALE_SMONDECIMALSEP вместо 3-х! :)



Для перечисления всех директорий достаточно FILE_ATTRIBUTE_DIRECTORY - у всех директорий этот флаг будет выставлен.

397
30 октября 2007 года
SergPas
527 / / 03.02.2007
Цитата:
Для перечисления всех директорий достаточно FILE_ATTRIBUTE_DIRECTORY - у всех директорий этот флаг будет выставлен

Увы и Ах! Нужно ещё задать и другие константы! Если указать только FILE_ATTRIBUTE_DIRECTORY, то такие папки, как "System Volume Information" и "Recycled" не будут добавлены в список перечисленных папок; тоже самое касается и папки "Program Files". Вот поэтому мы дополнительно включаем константу FILE_ATTRIBUTE_HIDDEN для папок- "System Volume Information" и "Recycled", а для папки "Program Files"- FILE_ATTRIBUTE_READONLY (без этой константы последняя будет отсутствовать).

534
31 октября 2007 года
HarryAxe
448 / / 19.01.2006
Так а нафига сравнивать? if dwFileAttributes and FILE_ATTRIBUTE_READONLY then ... и погнали
397
31 октября 2007 года
SergPas
527 / / 03.02.2007
Цитата:
if dwFileAttributes and FILE_ATTRIBUTE_READONLY then

А Вы уверены, что результат выполнения

Цитата:
dwFileAttributes and FILE_ATTRIBUTE_READONLY

будет булевского типа?

534
31 октября 2007 года
HarryAxe
448 / / 19.01.2006
Ок. if (dwFileAttributes and FILE_ATTRIBUTE_READONLY) <> 0 then ...
6.4K
31 октября 2007 года
Host
122 / / 22.09.2005
Цитата: SergPas
Если указать только FILE_ATTRIBUTE_DIRECTORY, то такие папки, как "System Volume Information" и "Recycled" не будут добавлены в список перечисленных папок...



Этот код выводит список папок, находящихся в корне диска С:

 
Код:
[SIZE=2]WIN32_FIND_DATA fd;[/SIZE]
[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, то уже не важно какие еще аттрибуты она имеет - это уже директория.

Тут работает не булева алгебра, а побитовое сложение.
534
01 ноября 2007 года
HarryAxe
448 / / 19.01.2006
Цитата: Host
Тут работает не булева алгебра, а побитовое сложение.


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

6.4K
01 ноября 2007 года
Host
122 / / 22.09.2005
Цитата: HarryAxe
Побитовое сложение суть "исключающее или", а операция "и" - это объединение двух множеств, и к сложению она имеет весьма посредственное отношение (если не сказать "никакого").



Может я не правильно выразился, поясняю свою мысль:

(DWORD) && (DWORD) - результат (BOOL)
(DWORD) & (DWORD) - результат (DWORD)

397
01 ноября 2007 года
SergPas
527 / / 03.02.2007
А может быть это просто работа компилятора С++, которая заключается в сжатии данных типа DWORD к типу bool. В Pascal'е так не прокатит...
534
02 ноября 2007 года
HarryAxe
448 / / 19.01.2006
Цитата: SergPas
А может быть это просто работа компилятора С++, которая заключается в сжатии данных типа DWORD к типу bool. В Pascal'е так не прокатит...


Оч даже прокатит. Ты сначала попробуй, потом утверждай. Можешь даже сразу n := 21 Or 45 для спортивного интереса.

Цитата:
Может я не правильно выразился, поясняю свою мысль:
(DWORD) && (DWORD) - результат (BOOL)
(DWORD) & (DWORD) - результат (DWORD)

Да, тот факт, что в паскале для Integer при проведении логических операций используются одни и те же ключевые слова (Or/Xor/Not/And), что и для Boolean, многих сбивает с толку.

397
03 ноября 2007 года
SergPas
527 / / 03.02.2007
Если бы я не проверял, я бы и не утверждал!
На код:
 
Код:
Var find_Data:WIN32_FIND_DATA;
...
if find_Data.dwFileAttributes and FILE_ATTRIBUTE_DIRECTORY then begin
//добавляем папку в TreeViewer
end;

компилятор Borland Delphi ругнётся "Type of expression must be BOOLEAN" или же "Тип выражения должен быть логическим". Здесь нужно либо применить явное преобразование типа следующим образом:
 
Код:
if BOOL(find_Data.dwFileAttributes and FILE_ATTRIBUTE_DIRECTORY) then begin
//добавляем папку в TreeViewer
end;

либо писать так:
 
Код:
if find_Data.dwFileAttributes=find_Data.dwFileAttributes and FILE_ATTRIBUTE_DIRECTORY then begin
//добавляем папку в TreeViewer
end;

либо так:
 
Код:
if (find_Data.dwFileAttributes and FILE_ATTRIBUTE_DIRECTORY)<>0 then begin
//добавляем папку в TreeViewer
end;

Цитата:
Если в аттрибутах стоит флаг FILE_ATTRIBUTE_DIRECTORY, то уже не важно какие еще аттрибуты она имеет - это уже директория.


Все, подчёркиваю, все папки, расположенные в корневом каталоге ищутся только при наличии констант FILE_ATTRIBUTE_HIDDEN и FILE_ATTRIBUTE_READONLY. По логике вещей, действительно, достаточно только одной константы для папок- FILE_ATTRIBUTE_DIRECTORY, но практика показывает, что одной её мало...

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог