检查一个文件夹是否可写。

9

我正在编写一个简单的文件服务器,使用套接字进行分配。在开始接受连接之前,我需要检查服务器是否可以向所服务的目录写入。

一种简单的方法是尝试创建一个文件,然后立即删除它并在失败时报错。但是如果文件已经存在呢?我的程序会崩溃或在此期间关闭吗?此外,这种方法似乎有点凌乱,不够优雅。

严格来说,代码只需要在评分人测试的Ubuntu系统上运行。因此,我可以使用stat()命令,获取当前uid和gid,并手动检查文件状态的权限。但我更愿意以可移植的方式完成这项工作,而这很繁琐。

是否有一种简单的C标准方法来实现这个功能?


1
你知道 access() 吗? - Charlie Burns
没有,看起来使用access()调用目录路径和W_OK参数可能会起作用。然后我可以检查它是否返回0。我现在会进行测试。 - Callum
2个回答

9
你可以使用来自的access。我不知道它是否是标准的一部分,但我认为它比stat更方便。
#include <errno.h>
#include <unistd.h>
#include <iostream>

int main(int argc, char** argv)
{
    int result = access("/root/", W_OK);
    if (result == 0)
    {
        std::cout << "Can W_OK" << std::endl;
    }
    else
    {
        std::cout << "Can't W_OK: " << result << std::endl;
    }
}

谢谢。下面是我发布的C版本。 - Callum
1
使用真实的用户ID而不是有效的用户ID进行访问检查。您需要使用带有AT_EACCESS标志的faccessat函数来检查有效用户和组ID的可访问性。 - Zangetsu
@Callum 感谢你为C问题添加了C版本。不知道这家伙在想什么。可能是想让stackoverflow变得更糟糕吧。 - undefined

7

是的,它有效,干杯。

#include <unistd.h>
#include <stdbool.h>

bool is_folder_writable(char* str) {
    if(access(str, W_OK) == 0) {
        return true;
    } else {
        return false;   
    }
}

很棒看到对一个C问题的C回答! - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接