Мне нужен способ поиска на компьютере таких файлов, как Проводник. Я хочу, чтобы моя программа на поиск позволяла говорить на жестком диске c :. мне нужно его для поиска C: \ для папок и файлов (только те, которые вы могли видеть в c: \ then, если пользователь нажимает на файл в списке, например, тест на папку (C: \ test), он будет искать тест и пусть пользователю видеть какие файлы/папки в немкак искать компьютер для файлов и папок
ответ
Поскольку вы упомянули окна, самый прямой WinAPI способ сделать это с FindFirstFile и FindNextFile функций.
Редактировать: Вот пример, который показывает вам, как перечислять все файлы/папки в каталоге.
#include <Windows.h>
#include <iostream>
int main()
{
WIN32_FIND_DATA file;
HANDLE search_handle=FindFirstFile(L"C:\\*",&file);
if (search_handle)
{
do
{
std::wcout << file.cFileName << std::endl;
}while(FindNextFile(search_handle,&file));
FindClose(search_handle);
}
}
вы можете использовать Directory
членов класса, чтобы сделать это с помощью C# или управляемом C++ обратитесь к следующей MSDN статье:..
http://support.microsoft.com/kb/307009
Если вы хотите использовать C++ с MFC вы можете использовать CFileFind
http://msdn.microsoft.com/en-us/library/f33e1618%28v=VS.80%29.aspx
Вам нужно будет предоставить свое собственное окно просмотра, чтобы представить дерево файловой системы.
Или вы можете использовать один из элементов управления каталогом/файлом, чтобы сделать это для вас.
Это использует .Net и требует использования C++/CLI. –
@Georg: Спасибо за разъяснение. Я добавил дополнительную информацию, если он хочет использовать C++ без .NET. –
: | я не вижу информацию – blood
Это зависит от ОС. SO вопрос
How can I get a list of files in a directory using C or C++?
обрабатывает эту проблему наилучшим образом. Вы можете скачать DIRENT здесь.
Теперь, когда у вас есть это, я бы рекомендовал рекурсивно искать файл с помощью алгоритма /BFS. Вы можете предположить, что вся структура каталогов - это tree, где каждый файл является листовым узлом, и каждый подкаталог является внутренним узлом.
Так все, что вам нужно сделать, это,
- Получить список файлов/папок в директории с такой функцией, как:
void getFilesFolders(vector<string> & dir_list, const string & folder_name)
- Если это каталог, перейдите на 1 с directory name
- Если это файл, прекратите работу, если это файл, который вы ищете, иначе перейдите к следующему файлу.
Как я могу получить список файлов в каталоге с помощью C или C++? это хорошо, но код я не могу работать. только код Брайана Р. Бонди самый последний из его, но он только находит файлы частью того, что я хотел, а также я не могу найти, как это работает, поэтому я не могу редактировать его для своей программы :( – blood
, играя с dirent to посмотрите, работает ли он, вернемся к вам на этом – blood
uhh я не могу получить dirent, я его загружаю, но он распаковывает файлы в формате .9 и все это. Я пропустил что-то, потому что я только что загрузил его со своей ссылки – blood
boost :: файловая система может быть кросс-платформенным решением для этого (обратите внимание на такие функции в нем).
#include <Windows.h>
#include <iostream>
int FindF(char* pDirectory)
{
char szFindPath[MAX_PATH] = {0};
strcpy(szFindPath, pDirectory);
strcat(szFindPath, "\\*");
WIN32_FIND_DATA file;
HANDLE search_handle=FindFirstFile(szFindPath,&file);
if (search_handle)
{
do
{
if(file.dwFileAttributes == FILE_ATTRIBUTE_DIRECTORY)
{
strcpy(szFindPath, pDirectory);
strcat(szFindPath, "\\");
strcat(szFindPath, file.cFileName);
FindF(szFindPath);
}
std::wcout << file.cFileName << std::endl;
}while(FindNextFile(search_handle,&file));
CloseHandle(search_handle);
}
}
Это почти хорошее решение, отличное от 1. В основном это C, но вы вставляете iostream, чтобы писать на C с помощью iostream ... Если вы хотите писать на C++, я бы хотя бы использовал std :: string. Ваша настоящая серьезная ошибка - вы не проверяете «точки», поэтому ваши будут рекурсивно (или, скорее всего, пострадают от названия этого сайта). – CashCow
Используйте FindClose(), чтобы закрыть дескриптор, открытый с помощью FindFirstFile(). CloseHandle() выкинет «недействительный дескриптор» в режиме отладки. – NoAngel
Для этого не нужно использовать стороннюю библиотеку. Это короткая независимая функция, которая перечисляет все файлы (с их путями) в каталоге, включая файлы поддиректориев. std::string folderName
должен заканчиваться \
, и если вы хотите перечислить все файлы на компьютере, просто создайте цикл в функции вызова вместе с GetLogicalDriveStrings (он возвращает строки с \
, поэтому в этом случае это не может быть более удобно).
void FindAllFiles(std::string folderName)
{
WIN32_FIND_DATA FileData;
std::string folderNameWithSt = folderName + "*";
HANDLE FirstFile = FindFirstFile(folderNameWithSt.c_str(), &FileData);
if (FirstFile != INVALID_HANDLE_VALUE) {
do {
if (strcmp(FileData.cFileName, ".") != 0 && strcmp(FileData.cFileName, "..") != 0)
{
if(FileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
{
std::string NewPath = folderName + FileData.cFileName;
NewPath = NewPath + "\\";
FindAllFiles(NewPath);
}
else
{
std::cout /*<< folderName*/ << FileData.cFileName << std::endl;
}
}
} while(FindNextFile(FirstFile, &FileData));
}
}
Это ASCII версия, помните, что файлы и папки могут быть названы в Unicode
Мне просто интересно, не могли бы вы объяснить, какие преимущества по сравнению с FindFile, пожалуйста? (и, кстати, не должно быть ASCII или ANSI?) –
И ваш вопрос ... что? –
Это специфичная для платформы проблема. Вы в Windows, Unix и т. Д.? – TreDubZedd
Если он ссылается на свой жесткий диск как 'C:' и каталоги в виде «папок», то вполне очевидно, что может быть его платформой ... ;-) Ой, и отделитель пути обратной косой черты также отдает его. –