Я пытаюсь использовать контейнер MAP для сопоставления ресурсов, теперь RESOURCEFILE получает всю информацию. Почему - PullRequest
0 голосов
/ 28 октября 2019

Вся информация в ResourcesMap разбита на части, когда речь идет о каталогах и именах файлов. Я не могу разобраться. когда шаг за шагом, я не вижу ошибок. Но при проверке информации в ResourcesMap все это испортилось.

Похоже, что процесс копирования что-то не так?

Это рекурсивная функция, которая сопоставляет имя ресурса с файловой структурой.

struct RESOURCE {
    char Name[MAX_PATH] = { NULL };
    int Level = 0;
    bool operator<(const RESOURCE& other) const
    {
    //write your compare function here...
    return (strcmp(Name, other.Name) < 0);
}

};


struct RESOURCEFILE {
char FileName[MAX_PATH] = { NULL };
DWORD ATTRIBUTE = 0;
};

map <RESOURCE, RESOURCEFILE> ResourcesMap;


void PolulateResources(HWND hDlg , RESOURCE Resource, RESOURCEFILE File) {
WIN32_FIND_DATA ffd;
HANDLE hFind = INVALID_HANDLE_VALUE;
wchar_t FileName[MAX_PATH] = { NULL };
mbstowcs(FileName, File.FileName, MAX_PATH);
hFind = FindFirstFile(FileName, &ffd);
do {
    if (INVALID_HANDLE_VALUE != hFind) {
        switch (ffd.dwFileAttributes) {
        case FILE_ATTRIBUTE_DIRECTORY: {
            char temp[MAX_PATH] = { NULL };
            wcstombs(temp, ffd.cFileName, MAX_PATH);
            File.ATTRIBUTE = ffd.dwFileAttributes;
            if (strcmp(temp, ".") != 0 && strcmp(temp, "..") != 0) {
                strcpy(Resource.Name, temp);
                AddItemToTree(GetDlgItem(hDlg, IDC_TREE1), temp, Resource.Level, g_nOpen, g_nClosed);
                File.FileName[strlen(File.FileName) - 1] = NULL;
                strcat(File.FileName, temp);
                ResourcesMap[Resource] = File;
                strcat(File.FileName, "\\*");
                int SaveLevel = Resource.Level++;
                PolulateResources(hDlg, Resource, File);
                File.FileName[strlen(File.FileName) - strlen(temp) - 1] = NULL;
                Resource.Level = SaveLevel;
            }
        }break;
        case FILE_ATTRIBUTE_NORMAL:
        case FILE_ATTRIBUTE_ARCHIVE:
        case FILE_ATTRIBUTE_READONLY:
        case FILE_ATTRIBUTE_HIDDEN: {
            //Resource->Level++;
            char temp[MAX_PATH] = { NULL };
            wcstombs(temp, ffd.cFileName, MAX_PATH);
            File.ATTRIBUTE = ffd.dwFileAttributes;
            strcpy(Resource.Name, temp);
            if (strstr(File.FileName, "\\*") != NULL) {
                File.FileName[strlen(File.FileName) - 1] = NULL;
                strcat(File.FileName, temp);
                ResourcesMap[Resource] = File;
                File.FileName[strlen(File.FileName) - strlen(temp)] = NULL;
                strcat(File.FileName, "*");
            }
            else {
                ResourcesMap[Resource] = File;
            }
            AddItemToTree(GetDlgItem(hDlg, IDC_TREE1), temp, Resource.Level, g_nDocument, g_nOpen);
        }break;
        }

    }
} while (FindNextFile(hFind, &ffd) != 0);

}

1 Ответ

0 голосов
/ 29 октября 2019

Вы можете использовать sprintf(), конвертируя WCHAR* в char*.

sprintf(File.ATTRIBUTE, "%ws", ffd.dwFileAttributes);

И атрибуты файла являются битами, вы должны использовать &, juat как это: wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY

Эта функция может найти все файлы в каталоге. Он напечатает полный путь к файлу. Вам нужно добавить карту в нужном месте. Параметры функции также необходимо изменить.

#include<Windows.h>
#include<map>
#include<iostream>

using namespace std;
WCHAR szFile[MAX_PATH];

BOOL IsRoot(LPCTSTR lpszPath)
{
    WCHAR szRoot[10] = {0};
    wsprintf(szRoot, L"%c:\\", lpszPath);
    wprintf(L"\n");
    return (lstrcmp(szRoot, lpszPath) == 0);
}

void FindInAll(LPCTSTR lpszPath)
{
    TCHAR szFind[MAX_PATH] = { 0 };
    lstrcpy(szFind, lpszPath); //use lstrcpy
    if (!IsRoot(szFind))
        lstrcat(szFind, L"\\");
    lstrcat(szFind, L"*.*"); //find all files

    HANDLE hFind = INVALID_HANDLE_VALUE;
    WIN32_FIND_DATA wfd;
    hFind = FindFirstFile(szFind, &wfd);

    if (hFind == INVALID_HANDLE_VALUE) 
        return;
    do
    {
        if (wfd.cFileName[0] == '.')
            continue; //ignore the "." and ".."
        if (wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
        {
            //add here
            wsprintf(szFile, L"%s\\%s", lpszPath, wfd.cFileName);
            wprintf(szFile);
            FindInAll(szFile); //If find a dirctory
        }
        else if(wfd.dwFileAttributes & FILE_ATTRIBUTE_HIDDEN)
        {   
            //add here
            wprintf(L"%ws\n", szFile); 
        }
    } while (FindNextFile(hFind, &wfd));

    FindClose(hFind); //close handle
}

int main()
{
    FindInAll(L"D:\\Demo");
    return 0;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...