如何在C中检查文件是否处于只读模式?我想检查是否可以在打开之前写入文件。
答案 0 :(得分:4)
在这种情况下,尝试打开文件进行写入是最容易和最可靠的,并且如果打开失败(“更容易要求宽恕而不是权限”)而不是尝试确定它是否会失败,则会做出适当的反应首先('先看你跳') - 见LBYL vs EAFP。
您可以使用stat()
,但正确确定权限是非常棘手的。此外,可能存在ACL,这意味着即使stat()
报告的权限表明您不能(或反之亦然),您也可以访问该文件进行写入。您可以使用access(filename, W_OK)
,它通常会给您正确的答案 - 除非您的程序运行的有效UID与实际UID不同。
然而,任何LBYL策略也会受到TOCTOU - 检查时间,使用时间 - 问题的影响。对文件或其中一个目录的权限可能会在您检查文件权限的时间与实际尝试打开文件的时间之间发生变化。权限可能说“没关系”,但文件可能已被删除,或者从那时起被更改为只读。
答案 1 :(得分:1)
您可以使用fstat()函数。 有关详细信息,请参阅man 2 fstat: http://linux.die.net/man/2/fstat
答案 2 :(得分:1)
您可以使用fopen,并检查返回值。点击此处:http://www.tutorialspoint.com/c_standard_library/c_function_fopen.htm
答案 3 :(得分:1)
虽然通过fstat
/ stat
函数检索文件权限会给你提供很好的提示,但是我会建议不要过多地信任它们,因为文件将会存在角落尽管报告是只读的,但仍然是可写的,例如,如果你是root用户,并且尽管被报告为可写,你也无法写入文件,例如,如果它位于只读文件系统上。
通过反转st_mode报告的内容,ACL也可能扮演类似混乱的角色。