我尝试使用MAP容器来映射资源,现在RESOURCEFILE正在获取所有信息.为什么

I try to use MAP container to map resources, Now the RESOURCEFILE is getting alll Info. Why

本文关键字:RESOURCEFILE 现在 获取 为什么 信息 资源 MAP 映射      更新时间:2023-10-16

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);
}

您可以使用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"%wsn", szFile); 
}
} while (FindNextFile(hFind, &wfd));
FindClose(hFind); //close handle
}
int main()
{
FindInAll(L"D:\Demo");
return 0;
}
相关文章: