使用创建文件功能创建文件会导致写保护文件

Creating file with CreateFile function results in write protected file

本文关键字:文件 创建 写保护 功能      更新时间:2023-10-16

我一直在尝试在SHGetFolderPath返回的路径中写入一个文件。但是在创建文件时,它已被赋予写保护。以下是我的代码:

#include <Windows.h>
#include <Shlobj.h>
#include <iostream>
#include <Shlwapi.h>
int main()
{
    HANDLE hfile;
    TCHAR szPath[MAX_PATH];
    char dataBuffer[] = "Some data to write here";
    DWORD dwBytesWritten = 0;
    if(SUCCEEDED(SHGetFolderPath(NULL,CSIDL_COMMON_APPDATA,NULL,0, szPath)))    
    {
        std::cout << szPath << std::endl;
        PathAppend(szPath,TEXT("lpa"));
        std::cout << szPath << std::endl;
        PathAppend(szPath,TEXT("config"));
        std::cout << szPath << std::endl;
        CreateDirectory(szPath, NULL);
        PathAppend(szPath, TEXT("lpa.config"));
        std::cout << szPath << std::endl;
        hfile = CreateFile(szPath,GENERIC_READ|GENERIC_WRITE,0,NULL,CREATE_NEW,FILE_ATTRIBUTE_NORMAL,NULL);
        /*WriteFile(hfile,dataBuffer,(DWORD)strlen(dataBuffer),&dwBytesWritten,NULL);
        std::cout << szPath <<std::endl;*/
    }
}

代码在 C:\ProgramData\lpa\config\lpa.config 中创建一个文件,但编辑该文件会弹出对话框,显示 WriteProtection。我在这里做错了什么?

是的,当您使用管理员权限运行 VS 实例时,会为创建的文件分配特殊权限。以非管理员身份作为程序运行,或使用SECURITY_DESCRIPTOR以便其他用户可以访问该文件。

在C++中为新对象创建安全描述符

链接中的示例显示了如何创建注册表项,您可以改为使用 CreateFile((。

我通过使用CSIDL_LOCAL_APPDATA而不是CSIDL_COMMON_APPDATA解决了这个问题。我有修改后的代码如下:

#include <Windows.h>
#include <Shlobj.h>
#include <iostream>
#include <Shlwapi.h>
int main()
{
    HANDLE hfile;
    TCHAR szPath[MAX_PATH];
    char dataBuffer[] = "Some data to write here";
    DWORD dwBytesWritten = 0;
    if(SUCCEEDED(SHGetFolderPath(NULL,CSIDL_LOCAL_APPDATA,NULL,0, szPath))) 
    {
        std::cout << szPath << std::endl;
        PathAppend(szPath,TEXT("lpa"));
        if(!CreateDirectory(szPath, NULL))
        {
            std::cout << "Create directory failed" <<std::endl;
        }
        std::cout << szPath << std::endl;
        PathAppend(szPath,TEXT("config"));
        if(!CreateDirectory(szPath, NULL))
        {
            std::cout << "Create directory failed" <<std::endl;
        }
        std::cout << szPath << std::endl;
        PathAppend(szPath, TEXT("lpa.config"));
        std::cout << szPath << std::endl;
        hfile = CreateFile(szPath,GENERIC_READ|GENERIC_WRITE,FILE_SHARE_READ|FILE_SHARE_WRITE,NULL,CREATE_NEW,FILE_ATTRIBUTE_NORMAL,NULL);
        WriteFile(hfile,dataBuffer,(DWORD)strlen(dataBuffer),&dwBytesWritten,NULL);
        std::cout << szPath <<std::endl;
    }
}