在 C 中获取文件的权限

Posted

技术标签:

【中文标题】在 C 中获取文件的权限【英文标题】:Obtaining permissions for a file in C 【发布时间】:2013-12-06 06:21:09 【问题描述】:

我正在寻找一种方法来检查并确保文件可读、可写和存在,如果不是,我想打印一条消息说明这一点。我相信我正在寻找的信息可以使用 fstat() 找到,我只是不知道获取它的正确方法。

如果我尝试使用 O_RDRW 打开不可读、不可写或不存在的文件时,如果 open 设置了特定的 errno,我认为这将是理想的解决方案。

这是我尝试过的:

//function to open the file
int f_open(const char *filename)
   int fid;
   if ((fid = open (filename, O_RDWR)) < -1)
      return -1;
   

   struct stat fileStat;
   if (fstat(fid, &fileStat) < 0)
      return -1;
   

   //check write permission
   if (!S_IWUSR(fileStat.st_mode))
      printf("Not writeable\n");
      return -1;
   
   //check read permissions
   if (!S_IRUSR(fileStat.st_mode))
    printf("Not readable\n");
    return -1;
   
   return fid;

我在尝试编译时收到以下错误:

tester.c: In function 'f_open':
tester.c:56:14: error: called object '128' is not a function
tester.c:60:14: error: called object '256' is not a function

【问题讨论】:

在尝试打开文件之前检查权限不是更有意义吗?特别是因为如果检查失败,您不会关闭文件。 关闭在不同的函数中处理。我之所以先调用 open 是因为我需要 fid 来调用 fstat()。 S_IWUSR 不是函数! en.wikibooks.org/wiki/C_Programming/POSIX_Reference/sys/… 是的,但是当您返回-1 时,文件不能被另一个函数关闭。 尽管这与您在问题中的代码无关,因为如果您没有正确的权限,open 将失败。因此,只有当文件存在并且您可以读写它时才会进行访问检查。 【参考方案1】:

您使用的宏是位值,而不是函数。

//check write permission
if ((S_IWUSR & fileStat.st_mode) == 0)
    printf("Not writeable\n");
    return -1;

此处示例:http://codewiki.wikidot.com/c:system-calls:fstat

编辑:上面指出的“访问”功能是更好的选择 IWUSR 不会告诉你是否可以编写它,它会告诉你所有者是否可以。

【讨论】:

【参考方案2】:

您可以使用access 进行权限检查

int rw = access(filename, R_OK | W_OK);
if (rw == 0) 
    /* read/write granted */

【讨论】:

以上是关于在 C 中获取文件的权限的主要内容,如果未能解决你的问题,请参考以下文章

如何获取权限删除文件?

c#获取文件上次访问权限或可用性

如何通过命令行取得安卓root权限

安卓开发怎么获取文件夹下面所有文件

bat如何自动获取管理员权限

win10正式版怎样获取system权限