#define IDENT '-'
#define IDENT_SIZE 1
using namespace std;
void printId(int n)
{
for(int i = 0; i < n * IDENT_SIZE; i++)
{
cout<<IDENT;
}
}
void listDir(char *dirName, int lev)
{
HANDLE h;
WIN32_FIND_DATA info;
char fullPath[MAX_PATH] = { '\0' };
strcpy(fullPath, dirName);
strcat(fullPath, "*.*");
if ((h = FindFirstFile(fullPath, &info)) != INVALID_HANDLE_VALUE)
{
do
{
if (!(strcmp(info.cFileName, ".") == 0 || strcmp(info.cFileName, "..") == 0))
{
if(info.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
{
printId(lev);
cout<<info.cFileName<<endl;
strcpy(fullPath, dirName);
strcat(fullPath, info.cFileName);
strcat(fullPath, "\\");
listDir(fullPath, level + 1);
}
}
}while(FindNextFile(h, &info));
FindClose(h);
}
}
void main()
{
char dir[MAX_PATH] = { нужный каталог};
listDir(dir, 0);
getchar();
}
С++.Проблема с выводом дерева каталогов
Как сделать, чтобы прога, представленная ниже, выводила не только имена каталогов, но и файлов(в том числе скрытых), что там есть?
Ну ещё для на всякий случай можно искать не по маске "*.*",а просто "*"(хотя вполне возможно,что "*.*" прокатит.Ну этот эксперимент я оставляю на ваше усмотрение)
И кстати,вроде в Си(или в API) есть специальная функция,чтобы выводить нужное количество символов(во!Минута поиска сразу дала результат)
Upd:хотя нет,проверку на папочность всё же надо оставить–вы ж в них потом ищете.Значит,если это была не папка(т.е. в else) выводите имя файла
а как сделать чтоб скрытые файлы выводились?
Если так,то пользоваться FindFirstFileEx/FindNextFileEx
Цитата: Akord
угу, спасибо, разобрался.
а как сделать чтоб скрытые файлы выводились?
а как сделать чтоб скрытые файлы выводились?
Подобная тема http://forum.codenet.ru/showthread.php?t=57999 Используются функции _findfirst() и _findnext() ( #include <io.h> ).
Информация о скрытых файлах тоже выводится.
Код:
FILE NAME SIZE
N:\
Копия boot.ini 214
pagefile.sys 268435456
Bootfont.bin 4952
ntldr 250624
NTDETECT.COM 47564
boot.ini 404
N:\
Копия boot.ini 214
pagefile.sys 268435456
Bootfont.bin 4952
ntldr 250624
NTDETECT.COM 47564
boot.ini 404
http://msdn.microsoft.com/en-us/library/aa246869(VS.60).aspx
_findfirst
Provides information about the first instance of a filename that matches the file specified in the filespec argument.
long _findfirst( char *filespec, struct _finddata_t *fileinfo );
у меня потом будет задаваться параметр ч\з командную строку, в зависимости от которого будут выводиться или все файлы или только те, что не имеют атрибута "скрытый". Как отделить "нормальные" файлы от скрытых?
Цитата: Akord
Как отделить "нормальные" файлы от скрытых?
Скрытый файл или нет, проверяем с помощью
Код:
if ( info.dwFileAttributes & FILE_ATTRIBUTE_HIDDEN)
См. также по поводу WIN32_FIND_DATA Structure
http://msdn.microsoft.com/en-us/library/aa365740(VS.85).aspx
В функцию main() добавим код
Код:
bool bPrintHidden=false;
// если в командной строке указано /h
// то скрытые файлы тоже печатаем
for ( int i=0; i<argc; i++)
{
if ( strcmp( argv, "/h") == 0 ) bPrintHidden=true;
}
// если в командной строке указано /h
// то скрытые файлы тоже печатаем
for ( int i=0; i<argc; i++)
{
if ( strcmp( argv, "/h") == 0 ) bPrintHidden=true;
}
Внутри цикла проверяем, печатать или нет.
Код:
// при печати проверяем
if( !( info.dwFileAttributes & FILE_ATTRIBUTE_HIDDEN) || bPrintHidden )
{
// выводим имя файла
}
if( !( info.dwFileAttributes & FILE_ATTRIBUTE_HIDDEN) || bPrintHidden )
{
// выводим имя файла
}
все работает, все понимаю)
Мне нужно использовать STL, а я не могу понять, с какого боку подступиться...