我尝试使用MAP容器来映射资源,现在RESOURCEFILE正在获取所有信息.为什么
I try to use MAP container to map resources, Now the RESOURCEFILE is getting alll Info. Why
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;
}
相关文章:
- 给定n个元素的m个集合.在C++中找到出现在最大集合数中的元素
- 不必要的C++代码最终会出现在我完成的程序中吗?
- 编译并运行后,输出未出现在 Visual Studio 代码中
- 如何使字符串出现在编译的二进制可执行文件的开头?
- 更新后的Android Studio现在需要Clang,不再链接到GCC的库
- 编译器现在遵循C++14标准,我的项目不再编译神秘的SFML错误
- C++复制 c'tor 现在确实会采取行动。 不清楚为什么
- "Program ended with exit code: 0"出现在我的输出的开头?
- 由于"error C4430: missing type specifier - int assumed. Note: C++ does not support default-int",我现在无法编
- "最小化"按钮不会出现在 MFC 对话框中
- 适用于 macOS 的 Xcode 应用程序。这就是我设置从USB麦克风输入获取音频的方式。一年前工作,现在没有了。为什么
- Cuda 中的多个 GPU - 以前可以使用代码,但现在不再使用
- 简化在 Pybind11 中为 C++ 模板类生成包装类:模板声明不能出现在块范围内
- 我已经做了一个程序来使用队列链C++表显示学生姓名和身高,现在我想以我不知道如何显示的顺序显示它
- 未按顺序出现在数组中的小写字母
- 更新 Visual Studio 2017,现在出现编译错误 C7510:"回调":使用依赖模板名称必须以 'template' 为前缀
- 钩/绕道 d3d9 (现在/结束场景) - 似乎调用我的函数然后崩溃
- 嵌套的循环现在不起作用
- 我的代码运行良好,但现在当尝试将其制作成模板时,我遇到了许多看似无关的错误。这是怎么回事?
- 我尝试使用MAP容器来映射资源,现在RESOURCEFILE正在获取所有信息.为什么