Member 12899279 Ответов: 2

Слишком много значений инициализатора ошибка TCHAR


я никак не могу избавиться от этой ошибки
TCHAR exts[] = { TEXT(".txt") ,TEXT(".docx") ,TEXT(".doc")}; /* null terminated array */


Что я уже пробовал:

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"))<

2 Ответов

Рейтинг:
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

это тоже не работает вот полный код

Код перешел к вопросу.