代码之家  ›  专栏  ›  技术社区  ›  Aviadjo

在Windows/Linux中检查对文件的写入权限

  •  7
  • Aviadjo  · 技术社区  · 14 年前

    我想知道如何检查我是否有对文件夹的写入权限。

    我正在写一个C++项目,我应该把一些数据打印到结果.txt文件,但我需要知道我是否有权限。

    Linux和Windows之间的检查不同吗?因为我的项目应该在Linux上运行,而我现在在Visual Studio中工作。

    3 回复  |  直到 13 年前
        1
  •  12
  •   Fred Foo    14 年前

    检查权限的可移植方法是尝试打开文件并检查是否成功。如果没有,以及 errno <cerrno> EACCES [是,使用一个S],则您没有足够的权限。这两种方法都适用 Unix/Linux Windows . stdio示例:

    FILE *fp = fopen("results.txt", "w");
    if (fp == NULL) {
        if (errno == EACCES)
            cerr << "Permission denied" << endl;
        else
            cerr << "Something went wrong: " << strerror(errno) << endl;
    }
    

    Iostreams的工作方式会有所不同。好吧,他们不保证 厄尔诺 在这两个平台上,或者报告比“失败”更具体的错误。

    正如杰里·科芬所写, 不要依赖单独的访问测试功能 因为你的程序很容易出现竞速和安全漏洞。

        2
  •  5
  •   Jerry Coffin    14 年前

    关于唯一合理的事情是尝试创建文件,如果失败,告诉用户有问题。任何提前测试的尝试,并且只有在您能够创建和写入文件时才尝试创建文件,它会打开,以解决竞赛条件(检查时有权限,但在尝试使用时已删除,反之亦然)和角点案例(例如,您已经 许可 在该目录中创建文件,但尝试在该目录中写入将超过磁盘配额)。唯一知道的方法就是尝试。。。

        3
  •  3
  •   SingleNegationElimination    14 年前

    实际测试文件写入权限的最正确方法是尝试写入文件。原因是不同的平台以非常不同的方式公开写权限。更糟糕的是,仅仅因为操作系统告诉您可以(或不能)写入一个文件,它实际上可能在撒谎,例如,在unix系统上,文件模式可能允许写入,但文件在只读介质上,或者相反,文件实际上可能是由内核创建的供进程自己使用的字符设备,因此尽管它的filemodes被设置为全零,但是内核允许该进程(并且只有该进程)随意地使用它。