Рейтинг:
17
Richard MacCutchan
Это основная процедура, которая работает.
BOOL rd_cb(LPTSTR lpszFile, PCTSTR pszExtension)
{
PCTSTR cur_ext = PathFindExtension(lpszFile);
if (cur_ext && _tcscmp(cur_ext, pszExtension) == 0)
{
wcout << "Found: " << lpszFile << endl;
return TRUE;
}
return FALSE;
}
int RecursiveDirectory(PCTSTR lpszPath, PCTSTR pszExtension)
{
WIN32_FIND_DATA WFD;
int qwCount = 0;
TCHAR szFileSpec[MAX_PATH + 1];
PathCombine(szFileSpec, lpszPath, TEXT("*.*"));
HANDLE hSearch = FindFirstFile(szFileSpec, &WFD);
if (hSearch == INVALID_HANDLE_VALUE) return 0;
do
{
if (_tcscmp(WFD.cFileName, TEXT("..")) && _tcscmp(WFD.cFileName, TEXT(".")))
{
if (WFD.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY && !(WFD.dwFileAttributes & FILE_ATTRIBUTE_REPARSE_POINT))
{
PathCombine(szFileSpec, lpszPath, WFD.cFileName);
qwCount += RecursiveDirectory(szFileSpec, pszExtension);
}
else
{
PathCombine(szFileSpec, lpszPath, WFD.cFileName);
if (rd_cb(szFileSpec, pszExtension))
qwCount++;
}
}
} while (FindNextFile(hSearch, &WFD));
FindClose(hSearch);
return qwCount;
}
Первый звонок будет примерно таким:
RecursiveDirectory(TEXT("C:\\Users\\username\\Documents"), TEXT(".txt"));
[редактировать]
Заменил lpCallback простым вызовом функции, чтобы упростить код.
[/редактировать]
Member 12899279
аргумент типа "PCTSTR" несовместим с параметром типа "LPVOID"
Richard MacCutchan
Ну, что бы вы ни делали, вы не используете вышеприведенный код.
Member 12899279
я использую точный приведенный выше код, я думаю, что вы не видели весь код и не копировали его, иначе вы бы знали...
Richard MacCutchan
Я протестировал приведенный выше код точно так, как показано на рисунке. Вы, должно быть, делаете что-то другое, чего не показываете мне.
Stefan_Lang
Измените второй параметр функции в вашем typedef для функции обратного вызова с LPVOID на PCTSTR
Richard MacCutchan
По размышлении он не нуждается в этой сложной конструкции. Достаточно прямого вызова другой функции.
Stefan_Lang
Иметь 5 баллов за исключительную работу при отягчающих обстоятельствах. ;-)
Richard MacCutchan
Спасибо, Стефан. Некоторым людям вы просто не можете помочь.
Рейтинг:
1
Richard MacCutchan
Скорее всего это происходит потому, что CHAR
не является определенным типом. Вы имели в виду использовать TCHAR
?
[редактировать]
Попробуй:
TCHAR* exts[] = { TEXT(".txt") ,TEXT(".docx") ,TEXT(".doc")}; /* null terminated array of strings */
или еще лучше
PTCSTR exts[] = { TEXT(".txt") ,TEXT(".docx") ,TEXT(".doc")}; /* null terminated array */
[/редактировать]
[изменить последовательность="2"]
Что-то вроде этого ...
// caller
PTCSTR exts[] = { TEXT(".txt") ,TEXT(".docx") ,TEXT(".doc"), NULL}; // null terminated array
DoSearch(TEXT("rootdirectory"), exts);
// ...
// function
... DoSearch(PCTSTR rootDirectory, PCTSTR* extensions)
{
while (*extensions != NULL)
{
// process next extension
Recursive(rootDirectory, *extensions);
extensions++; point to the next entry
}
}
[/редактировать]
Member 12899279
ох, простите мою ошибку, да это WS я изменил в файле TCHAR в char одновременно пытаясь убрать ошибку
Member 12899279
я действительно сделал tht, но проблема в том, что я передаю его в funton, и он только принимает расширение .txt и не проверяет другие расширения вот пример моего func, в котором я передаю это
пустота ext_search(в файле TCHAR *root_dir, в файле TCHAR *расширению)
{
RecursiveDirectory(root_dir, rd_cb, (void *)exts);
}
Richard MacCutchan
И снова вы передаете только указатель на первую запись: указатель на массив символов. Воспользуйся PTSTR
или PCTSTR
который представляет собой массив строк, и гораздо более четкий.
Кроме того, почему вы используете void*
а не правильный тип?
Member 12899279
вы можете показать, как это делается?или я не могу использовать цикл для перебора всех расширений одно за другим?
Member 12899279
я только что проверил, заменив его на PTSTR, но из-за некоторых ограничений я могу использовать только tchar, поэтому мне нужно сделать здесь какой-то цикл, чтобы перебирать все расширения по одному и вызывать функцию recursivedirectory()с каждым расширением по одному
Richard MacCutchan
Это не имеет никакого смысла, единственное ограничение-это то, которое вы вводите в свой код. Смотрите мое обновленное решение.
Member 12899279
я могу пройти через все расширения с помощью этого кода:
void ext_search(TCHAR *root_dir, PCTSTR *exts)
{
в то время как (*расширению != Нуль)
{
// обработать следующее расширение
RecursiveDirectory(root_dir, rd_cb, (VOID *)exts);
*расширению++;
}
}
example_func недействительным(ничтожным)
{
PCTSTR расширению[] = { текст(".тхт") ,текст(".файлы DOCX") ,текст(".док"),значение null }; /* значение null массив */
ext_search(текст("с:"), расширению);
}
но проблема заключается в том, что он передает некоторое значение типа мусора следующей функции, поэтому он не может соответствовать расширению ниже приведен код для соответствующего расширения
BOOL WINAPI rd_cb(TCHAR *file_path, VOID *param)
{
TCHAR *exts;
exts = (TCHAR*)param;
//расширению = парам;
в то время как (*расширению) {
В файле TCHAR *cur_ext;
cur_ext = PathFindExtension(file_path);
если (cur_ext) {
if (_tcscmp(cur_ext, exts) == 0) {
/* делайте здесь с файлом все, что хотите */
/* printf в качестве примера здесь */
// _tprintf(TEXT("%s\n"), file_path);
//file << quoted(chk);
файл << (текст("\n"))<
Richard MacCutchan
Ваш код нелегко понять. Что такое RecursiveDirectory
и где это определено? Кроме того, в rd_cb
вы должны объявить param как PCTSTR, так как он ссылается на одну строку расширения. Не используйте void* (и определенно не VOID*), если вам это абсолютно не нужно. А также внутри rd_cb
у тебя есть while (*exts)
, но exts
существует одна строка, так почему же вы пытаетесь перебирать ее?
И наконец ты говоришь - но проблема в том, что он пропускает какой-то мусор" Вам нужно показать, где это происходит и что именно представляет собой этот "мусор".
Member 12899279
теперь я опубликовал полный код, в котором определена функция RecursiveDirectory
Member 12899279
когда я перехожу от ext_search к rd_cb, то второй параметр в rd_cb не получает то, что было передано как расширение из ext_search теперь вы можете вставить весь код и просто вызвать ext_search из main, и вы можете видеть, что в debug то, о чем я говорю
Member 12899279
это тоже не работает вот полный код
Код перешел к вопросу.