Автор |
Сообщение |
BS Эксперт |
|
Список файлов и папа. Подскажите...
И как перемещатся в папках? |
|
|
|
|
perf Продвинутый форумчанин |
|
тут нужно указывать не язык, а ос.
если виндовс, то надо юзать FindFirstFile/FindNextFile из ее api.
см. msdn. |
|
|
|
|
BS Эксперт |
|
ОС, Виноус. Я для консольки хочу. МСДН нет. Просто можно простой пример, плиз?
То, что надо юзать подобные методы я уже понял. Нашёл в справки к борлан си. Но писать буду под MVS 2003. |
|
|
|
|
perf Продвинутый форумчанин |
|
очень плохо, там даже пример кода есть.
Код: |
#define _WIN32_WINNT 0x0501
#include <windows.h>
#include <string.h>
#include <stdio.h>
int main(int argc, char *argv[])
{
WIN32_FIND_DATA FindFileData;
HANDLE hFind = INVALID_HANDLE_VALUE;
char DirSpec[MAX_PATH]; // directory specification
DWORD dwError;
printf ("Target directory is %s.\n", argv[1]);
strncpy (DirSpec, argv[1], strlen(argv[1])+1);
strncat (DirSpec, "\\*", 3);
hFind = FindFirstFile(DirSpec, &FindFileData);
if (hFind == INVALID_HANDLE_VALUE)
{
printf ("Invalid file handle. Error is %u\n", GetLastError());
return (-1);
}
else
{
printf ("First file name is %s\n", FindFileData.cFileName);
while (FindNextFile(hFind, &FindFileData) != 0)
{
printf ("Next file name is %s\n", FindFileData.cFileName);
}
dwError = GetLastError();
FindClose(hFind);
if (dwError != ERROR_NO_MORE_FILES)
{
printf ("FindNextFile error. Error is %u\n", dwError);
return (-1);
}
}
return (0);
}
|
другой вариант:
Код: |
WIN32_FIND_DATA findData;
HANDLE hFind = FindFirstFile("c:\\", &findData);
if (hFind != INVALID_HANDLE_VALUE)
{
BOOL moreFiles = FALSE;
do
{
// attributes chars
char dir = (findData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY ? 'd' : '-');
char hidden = (findData.dwFileAttributes & FILE_ATTRIBUTE_HIDDEN ? 'h' : '-');
char readonly = (findData.dwFileAttributes & FILE_ATTRIBUTE_READONLY ? 'r' : '-');
const char* name = findData.cFileName;
// print out
printf("%c%c%c %s\r\n", dir, hidden, readonly, name);
// move next
moreFiles = FindNextFile(hFind, &findData);
}
while (moreFiles);
FindClose(hFind);
}
|
|
|
|
|
|
BS Эксперт |
|
Большое спасибо!
Сегодня вечром попобую! |
|
|
|
|
Darvik Форумчанин |
|
Есть интернет но нет msdn - ставим твердую два |
|
|
|
|
BS Эксперт |
|
Я предпочёл первый вариант кода. Он более прост, с точки зрения понимания. Кстати в нём есть вде смертельные ошибки. Обошёл их и заставил его работать для себя. Спасиб, perf!
Darvik
Критиковать может каждый. |
|
|
|
|
BS Эксперт |
|
А как отличать файлы от папок???
Не у всех файлов есть расширения. |
|
|
|
|
perf Продвинутый форумчанин |
|
|
|
|
BS Эксперт |
|
Получилось, кстати, вот что
#define _WIN32_WINNT 0x0501
#include <windows.h>
#include <string.h>
#include <stdio.h>
#include <malloc.h>
struct FileList
{
char fileName[256];
FileList *next;
};
void addToList(FileList *&head, char str[])
{
FileList *tmp=NULL;
tmp=(FileList *)malloc(sizeof(FileList));
strcpy(tmp->fileName,str);
tmp->next=head;
head=tmp;
}
FileList *getFileNameList(char const folder[])//Надо подавать адрес до папки без последнего /, например C:\temp
{
FileList *head;
////////////////////////////////////////
WIN32_FIND_DATA FindFileData;
HANDLE hFind = INVALID_HANDLE_VALUE;
char DirSpec[256]; // directory specification
DWORD dwError;
strcpy(DirSpec,folder);
int lenth=strlen(DirSpec);
DirSpec[lenth]='\\';
DirSpec[lenth+1]='*';
DirSpec[lenth+2]=0;
hFind = FindFirstFile(DirSpec, &FindFileData);
if (hFind == INVALID_HANDLE_VALUE)
{
printf ("Invalid file handle. Error is %u\n", GetLastError());
return NULL;
}
else
{
//printf ("First file name is %s\n", FindFileData.cFileName);
head=(FileList*)malloc(sizeof(FileList));
head->next=NULL;
strcpy(head->fileName,FindFileData.cFileName);
while (FindNextFile(hFind, &FindFileData) != 0)
{
//printf ("Next file name is %s\n", FindFileData.cFileName);
addToList(head,FindFileData.cFileName);
}
dwError = GetLastError();
FindClose(hFind);
if (dwError != ERROR_NO_MORE_FILES)
{
printf ("FindNextFile error. Error is %u\n", dwError);
return NULL;
}
}
////////////////////////////////////////
return head;
}
int main(int argc, char *argv[])
{
FileList *head=getFileNameList("C:\\Temp");
return (0);
}
т.е. берём указателю присваеваем получить список файлов(и папок, как я понял) и даём в аргумент каталог. Указатель будет на ноль, еслис это не удалось. |
|
|
|
|
perf Продвинутый форумчанин |
|
BS
используй тэги code с сохранением форматирования кода
разбираться в этой каше желания нет |
|
|
|
|
perf Продвинутый форумчанин |
|
BS писал(а): |
Получилось, кстати, вот что |
жесковато конечно
вариант попроще
Код: |
#include <windows.h>
#include <stdio.h>
#include <vector>
#include <string>
#include <algorithm>
typedef std::vector<std::string> StringVector;
void getFileNameList(std::string path, StringVector* fileList)
{
WIN32_FIND_DATA findData;
HANDLE hFind = FindFirstFile(path.c_str(), &findData);
if (hFind != INVALID_HANDLE_VALUE)
{
BOOL moreFiles = TRUE;
while (moreFiles)
{
const char* name = findData.cFileName;
fileList->push_back(name);
// move next
moreFiles = FindNextFile(hFind, &findData);
}
FindClose(hFind);
}
}
int print_string(std::string str)
{
printf("%s\r\n", str.c_str());
return 0;
}
int main(int argc, char *argv[])
{
StringVector fileList;
// заполнить список файлов
getFileNameList("C:\\windows\\*", &fileList);
//
// вывод на экран
//
// по простому
for(int i=0; i<fileList.size(); i++)
{
printf("%s\r\n", fileList[i].c_str());
}
// по выпендрежному
std::for_each(fileList.begin(), fileList.end(), print_string);
return 0;
}
|
|
|
|
|
|
BS Эксперт |
|
Это конечно красиво, но я не силён в этом пока. Иначе бы не спрашивал.
perf писал(а): |
второй пример смотрел невнимательно |
Точно) Заметил теперь...
ещё раз спасибо
[/list] |
|
|
|
|
perf Продвинутый форумчанин |
|
BS писал(а): |
Это конечно красиво, но я не силён в этом пока. Иначе бы не спрашивал. |
показываю к чему нужно идти.
твой код - на С, а не на С++. |
|
|
|
|
BS Эксперт |
|
perf,
не всё сразу...
|
|
|
|
|
|