Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 检查文件存在和读取权限_C_File_Permissions_Stat - Fatal编程技术网

C 检查文件存在和读取权限

C 检查文件存在和读取权限,c,file,permissions,stat,C,File,Permissions,Stat,我正在尝试检查由file\u path指定的文件是否存在并且可读。这是我的代码: if (stat(file_path,&fileStat) > 0 && (fileStat.st_mode & S_IRUSR)) { puts("SUCCESS"); create_message(OK); } 你能检测出给定代码的问题吗?部分(fileStat.st\u mode&S\u IRUSR)正确吗?您不需要stat()来完成此操作,而是需要ac

我正在尝试检查由
file\u path
指定的文件是否存在并且可读。这是我的代码:

if (stat(file_path,&fileStat) > 0 && (fileStat.st_mode & S_IRUSR))
{
    puts("SUCCESS");
    create_message(OK);
}
你能检测出给定代码的问题吗?部分
(fileStat.st\u mode&S\u IRUSR)
正确吗?

您不需要stat()来完成此操作,而是需要access()

正如Jonathan Leffler指出的那样,如果您更改了stat()返回值的测试,那么您的代码就可以工作了,但是Unix提供了一个系统调用来精确地执行您想要的操作,因此您最好使用它


但正如其他评论者所指出的,如果您要阅读此文件,最好将其打开阅读,并让打开失败通知您问题所在。

file*f=fopen(file_path,“rb”);如果(f){puts(“SUCCESS”);create_message(OK);}
将避免在以后实际读取指定文件时发生错误(完成后不要忘记关闭文件)。如果您只是检查读取权限,那么您就没事了,除非您可能想使用
S|irsr | S|IRGRP | S|IROTH
来获得一般读取权限,而不是检查文件的所有者是否可读(
S|IRUSR
),因为您可能不是文件所有者(例如
/usr/bin/2to3
)。为什么要检查文件是否存在且可读?如果是这样,你可以打开阅读,跳过检查,直接打开阅读。仅仅因为您的检查告诉您该文件存在,并且您的粗略权限检查表明您可以读取该文件,这并不意味着您可以实际打开该文件进行读取。除了文件权限位,还有很多其他权限检查—ACL和“额外”安全检查(如SE Linux中的安全检查)可以阻止您读取文件。一般来说,检查X是否可以执行Y是一个坏主意-X不是Y。
stat()
成功时返回0。
if (access(filename, R_OK)) {
    // code to handle missing or unreadable file
} else {
    // code to handle readable file
}