Нужно написать программу выводящую полное дерево диска.
Я думаю, что можно использовать что-нибудь типа FindFile/FindNext с параметром "*.*", но сам так никогда не делал и эти функции API(как и другие) не использовал. Вообще-то я не уверен в существовании таких функций, а поиск по MSDN от VS .NET однозначных результатов не дал, так что буду рад, если вы подскажите имена API функций.
Желательно еще немного объяснить как распознать ситуацию когда все файлы на диске уже перебраны.
В общем — помогите чем можете, но только не готовым исходным кодом — хочу пробовать писать сам.
Здравствуйте, Keith, Вы писали:
K> Нужно написать программу выводящую полное дерево диска. K> Я думаю, что можно использовать что-нибудь типа FindFile/FindNext с параметром "*.*", но сам так никогда не делал и эти функции API(как и другие) не использовал. Вообще-то я не уверен в существовании таких функций, а поиск по MSDN от VS .NET однозначных результатов не дал, так что буду рад, если вы подскажите имена API функций. K>Желательно еще немного объяснить как распознать ситуацию когда все файлы на диске уже перебраны. K>В общем — помогите чем можете, но только не готовым исходным кодом — хочу пробовать писать сам.
API верное
предположение тоже, только названия чуть другие: FindFirstFile, FindNextFile, FindClose
ситуацию легко распознать используя рекурсивные вызовы свое ф-ии перебора для фолдера:
ее натравливаем на корневой фолдер диска и в ней перебираем все файлы-фолдеры,
а если встретили фолдер то не забываем вызвать себя еще раз но с новым именем подфолдера.
Когда все подфолдеры закончатся, ф-я переберет оставшиеся файлы и вернется.
... << RSDN@Home 1.1 beta 2 >>
Valery A. Boronin, RSDN Team, linkedin.com\in\boronin
R&D Mgmt & Security. AppSec & SDL. Data Protection and Systems Programming. FDE, DLP, Incident Management. Windows Filesystems and Drivers.
V>API верное V>предположение тоже, только названия чуть другие: FindFirstFile, FindNextFile, FindClose V>ситуацию легко распознать используя рекурсивные вызовы свое ф-ии перебора для фолдера: V>ее натравливаем на корневой фолдер диска и в ней перебираем все файлы-фолдеры, V>а если встретили фолдер то не забываем вызвать себя еще раз но с новым именем подфолдера. V>Когда все подфолдеры закончатся, ф-я переберет оставшиеся файлы и вернется.
Создал на C:\ каталог "1", а в нем еще "2", "3" и "4" и в них ни одного файла. Взял из MSDN такую прогу
int
main(int argc, char *argv[])
{
WIN32_FIND_DATA FindFileData;
HANDLE hFind;
printf("Target file is %s\n", argv[1]);
hFind = FindFirstFile(argv[1], &FindFileData);
if (hFind == INVALID_HANDLE_VALUE) {
printf("Invalid File Handle. Get Last Error reports %d\n", GetLastError ());
} else {
printf("The first file found is %s\n", FindFileData.cFileName);
FindClose(hFind);
}
getchar();
return 0;
}
запусакаю ее с параметром "c:\1\*.*", а она выдает:
Target file is c:\1\*.*
The first file found is .
Так как получить имя подфолдера, т.е. в данном случае "2"?
FindFileData.dwFileAttributes возвращает значение FILE_ATTRIBUTE_DIRECTORY.
И еще, я хочу выводить в таком виде:
c:
1
file1.txt
file2.txt
2
file3.txt
т.е. слево добавлять пробелы по кол-ву вложенности, так вот как это лучше сделать? Придумал только статическую переменную внутри рекурчивной функции поиска сделать и увеличивать ее каждый раз при нахождении более глубоко фолдера и уменьшать при выходе на меньшую степень вложенности. Кстати, а как определить что я вышел на меньшую степень вложенности?
В общем интересуют варианты пешения, но желательно не в коде, а на словах.
... K> В общем интересуют варианты пешения, но желательно не в коде, а на словах.
1) Для перебора дерева каталогов рекурсия — вещь подходящая.
2) Для отслеживания уровня просто и эффективно использовать в этой рекурсивной функции доп. параметр, передаваемый по значению. В начале тела фукции прибавлять к нему единицу. (есть, конечно, и другие варианты, но этот кажется хорошим)
K> Кстати, а как определить что я вышел на меньшую степень вложенности?
Если подумать как следует над вопросом, то он из разрядов самообмана. Зачем тебе это?
Впрочем, формально на него ответить несложно: строчка следующая за рекурсивным вызовом функции и есть "то место, где ты вышел на меньшую степень вложенности".
K> The first file found is .
Для ясности, просто напомню (а может и открою глаза ), что в каждом каталоге, кроме того, что ты видишь в "проводнике Windows" формально есть еще два "псевдокаталога"(ссылки на каталог): . — текущий каталог (т.е. что-то вроде указателя this ) .. — каталог уровнем выше.
Их ты и получаешь первым делом.
Вот поэтому The first file found is .
K> Так как получить имя подфолдера, т.е. в данном случае "2"?
Соответственно, продолжив перебор при помощи функции FindNextFile.
Здравствуйте, Keith, Вы писали:
K> Нужно написать программу выводящую полное дерево диска. K> Я думаю, что можно использовать что-нибудь типа FindFile/FindNext с
Я когда-то делал такую штуку. Могу кинуть.