需要知道一个目录在 C++ 中是不是有写权限

Posted

技术标签:

【中文标题】需要知道一个目录在 C++ 中是不是有写权限【英文标题】:Need to know if a directory has write permission or not in C++需要知道一个目录在 C++ 中是否有写权限 【发布时间】:2013-11-15 06:56:10 【问题描述】:

我需要知道指定目录(本地或具有登录凭据的共享路径)是否具有写入权限。

我正在使用 GetFileAttributes,但它总是返回 FILE_ATTRIBUTE_DIRECTORY 而没有别的。

我的代码如下所示

if(storageLocation != "")

    //! check if local storage - user name password would be empty
    if(storageUsername == "" && storagePassword == "")
    
        //! local storage
        //! lets check whether the local path is a valid path or not
        boost::filesystem::path fpath(storageUsername.c_str());
        if(boost::filesystem::exists(fpath))
        
            DWORD attrib = ::GetFileAttributes(storageLocation.c_str());
            if((attrib != INVALID_FILE_ATTRIBUTES) && 
              ((attrib & FILE_ATTRIBUTE_READONLY) != FILE_ATTRIBUTE_READONLY))
            
                string strWritePermission = "TRUE";
            
        
    
    else
    
        uncLocation_t uncLocation;
        uncLocation.m_location = storageLocation;
        uncLocation.m_username = storageUsername;
        uncLocation.m_password = storagePassword;
        if(0 == connectToUNCLocation(uncLocation)) // My function to connect to UNC location
        
            //! successful connection
            DWORD attrib = ::GetFileAttributes(storageLocation.c_str());
            if((attrib != INVALID_FILE_ATTRIBUTES) && 
               ((attrib & FILE_ATTRIBUTE_READONLY) != FILE_ATTRIBUTE_READONLY))
            
                string strWritePermission = "TRUE";
            
        
    

我不明白为什么,但 GetFileAttributes 总是返回 0x16。

我已经通过创建一个共享文件夹并在其中创建 2 个文件夹对其进行了测试。一个具有只读权限,另一个具有默认权限。但在所有 3 种情况下(共享文件夹、只读文件夹和默认权限文件夹)我都得到相同的返回值。

有办法找到写权限,创建一个临时文件(在 GENERIC_WRITE 模式下使用 CreateFile),如果成功创建,删除它。但我不想使用这种方法,因为我不希望我的应用程序在每次用户指定位置时都创建一个临时文件。

请建议应该做什么。

【问题讨论】:

【参考方案1】:

您需要复制 Windows 执行的安全检查。 AccessCheck 函数将对此有所帮助。您目前在查看文件属性方面做得很差。 Windows 安全性远比这复杂得多。

虽然你说不想做,但正确的解决办法是不要去尝试检查。简单地做任何你想做的事情。如果系统判断用户没有足够的权限,那么CreateFile会失败,最后一个错误会设置为ERROR_ACCESS_DENIED。不需要临时文件。你只是尝试做你正在做的任何事情,然后让它失败。无论如何,您都必须处理失败,因为文件操作失败的方式有很多,而不仅仅是安全性。

俗话说,求饶不如求准。

【讨论】:

我在我的问题中遗漏了一点。当用户指定一个位置时,我想让他知道这个位置是否正确。错误的位置意味着不存在路径或对目录的非写访问。我想提醒用户您指定的路径没有写权限,您可以更改它。这就是我不想使用 CreateFile 进行检查的原因,如果您可以提供用于检查权限的示例代码(使用 AccessCheck),它将非常有用。我想使用这个位置来转储数据(文本文件、jpeg 图像等)。我需要知道路径是否有写权限 您可以找到大量使用 AccessCheck 的示例。你可以只做网络搜索。这里不需要任何人重复这一点。无论如何,我不想鼓励我认为是错误的解决方案。 之前有有效的用例检查权限。例如,在服务启动时验证配置中的目录,而不是在服务想要在其中创建文件时失败。【参考方案2】:

我想你正在寻找AccessCheck。仅供参考,这不是 C++ 问题,而是 Windows API 问题。

【讨论】:

以上是关于需要知道一个目录在 C++ 中是不是有写权限的主要内容,如果未能解决你的问题,请参考以下文章

VC++判断当前程序对文件或文件夹是否有写权限(附源码)

用户对目录有写权限,但对目录下的文件没有写权限时,能否修改此文件的内容?能否删除此文件?

Java中如何检查文件是不是存在于目录中

求助,postgresql服务启动不了

如何以编程方式获得 root 权限?

SSH配置AUTHORIZED_KEYS后仍然需要输入密码的问题