C、Windows API递归导航子目录

标签 c winapi recursion

程序递归地导航给定文件夹,为文件夹创建注册表,但执行 RegSetValueEx 函数后注册表中没有任何反应,我应该更改什么?我的意思是该程序运行完美,但注册表中关于 RegSetValuesEx 函数没有任何变化,只是 RegCreateKeys 运行良好。

#include "stdafx.h"
#include <windows.h>
#include <tchar.h> 
#include <stdio.h>
#include <strsafe.h>
#include <iostream>
using namespace std;
#define DEFAULT_KEY_DIR "HKEY_CURRENT_USER"
#define DEFAULT_KEY_SUBDIR "Software\\CSSO"
#define DEFAULT_DIRECTORY "D:\\Example"
char xPath[2048] = "Software\\CSSO";

bool ListDirectoryContents(const char *sDir)  
{
WIN32_FIND_DATA fdFile;
HANDLE hFind = NULL;
LARGE_INTEGER filesize;
DWORD return_value;
char sPath[2048];
HKEY hKey;


sprintf(sPath, "%s\\*", sDir);

if ((hFind = FindFirstFile(sPath, &fdFile)) == INVALID_HANDLE_VALUE)
{
    printf("Path not found: [%s]\n", sDir);
    return false;
}

do
{

    if (strcmp(fdFile.cFileName, ".") != 0
        && strcmp(fdFile.cFileName, "..") != 0)
    {

        sprintf(sPath, "%s\\%s", sDir, fdFile.cFileName);


        if (fdFile.dwFileAttributes &FILE_ATTRIBUTE_DIRECTORY)
        {

            printf("%s\n", sPath);
            memset(&xPath[0], 0, sizeof(xPath));
            strcpy(xPath, DEFAULT_KEY_SUBDIR);
            int j = strlen(DEFAULT_KEY_SUBDIR);
            for (int i = strlen(DEFAULT_DIRECTORY); i < strlen(sPath); i++)
            {
                xPath[j] = sPath[i];
                j++;
            }


                RegCreateKeyEx(
                HKEY_CURRENT_USER,
                xPath,
                0, 0, REG_OPTION_NON_VOLATILE,
                KEY_ALL_ACCESS, 0, &hKey, 0
            );

            ListDirectoryContents(sPath); //Recursion, I love it!
        }
        else {
            filesize.LowPart = fdFile.nFileSizeLow;
            filesize.HighPart = fdFile.nFileSizeHigh;
            _tprintf(TEXT("%s  %ld bytes\n"),sPath, filesize.QuadPart);

            return_value = RegSetValueEx(
                hKey,
                fdFile.cFileName, 0,
                REG_DWORD,
                (BYTE*)filesize.QuadPart,
                strlen(sPath)
            );
        }
    }
} while (FindNextFile(hFind, &fdFile)); 

FindClose(hFind); 

return true;
}

int main()
{
ListDirectoryContents("D:\\Example");
system("PAUSE");
return 0;
}

最佳答案

上面的代码正在经历一个递归循环,它向注册表添加了大量垃圾。不建议这样做。

return_value = RegSetValueEx(
            hKey,
            fdFile.cFileName, 0,
            REG_DWORD,
            (BYTE*)filesize.QuadPart,
            strlen(sPath))

(BYTE*)filesize.QuadPart 错误。类似于这样写:

BYTE* ptr = (BYTE*)123;

这将创建一个指向内存地址 123 的指针,我们不允许对其进行修改。您的意思是改为编写 (BYTE*)&filesize.QuadPart

假设您要写入文件大小,请使用 REG_QWORD 而不是 REG_DWORD。使用 sizeof(filesize.QuadPart) 而不是 strlen(path)

if (ERROR_SUCCESS != RegSetValueEx(hKey, fdFile.cFileName, 0, REG_QWORD, 
    (BYTE*)&filesize.QuadPart, sizeof(filesize.QuadPart))
{
    printf("RegSetValueEx error\n");    
}

但是,您应该仅使用注册表来添加初始化数据。如果您有大量数据,则保存到文件,或者只是将其保存在内存中。

关于C、Windows API递归导航子目录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46760012/

相关文章:

javascript - TypeScript 中的异步/等待递归树遍历

c - 学习 'Linked lists' 的速度太快,但又不太熟悉指针? #C语言初学者

c++ - 如何在win32 C++项目Visual Studio 2010中使用ActiveX dll

c - Unix 机器上 C 程序中的总线错误

c - 使用 WinApi 另存为 .REG 文件

winapi - 获取 Windows 上任何用户的 CSIDL_LOCAL_APPDATA 路径

java - 递归构建 <ul> 列表

c++ - 如何获取n叉树中的元素

java - Swig 如何定义一个类型映射,将 C 类型定义的 boolean 值转换为 java boolean 值

c - 使用 NETLINK 的 VLAN 信息