需要知道目录是否在C ++中具有写权限

时间:2013-11-15 06:56:11

标签: c++ winapi visual-c++ msdn

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

我正在使用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),如果成功创建,则删除它。但我不想使用这种方法,因为我不希望每次用户指定位置时我的应用程序都会创建一个临时文件。

请建议应该做些什么。

2 个答案:

答案 0 :(得分:2)

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

虽然你说你不想这样做,但正确的解决办法不是试图检查。只要做你想做的任何事情。如果系统确定用户没有足够的权限,则CreateFile将失败,最后一个错误将设置为ERROR_ACCESS_DENIED。不需要临时文件。你只是尝试做你正在做的事情,让它失败。无论如何,你必须处理失败,因为有很多方法可以使文件操作失败,而不仅仅是安全性。

俗话说,请求宽恕比获得许可更好。

答案 1 :(得分:1)

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