一个简单的问题:
如何检查已打开文件指针的访问模式?
假设一个函数被传递给一个已经打开的 FILE 指针:
//Pseudo code
bool PseudoFunction(FILE *Ptr)
{
if( ... Insert check for read-only access rights )
{
//It's read only access mode
return true;
}
//File pointer is not read-only and thus write operations are permitted
return false;
}
我将在 if 语句中使用什么来检查 FILE 指针是否以只读方式打开(或不是,视情况而定),而不写入文件,并且不依赖于用户传递(可能矛盾) 参数?
系统是windows,code::blocks编译器,但是为了代码的可移植性,交叉兼容性优先。
请注意,这不是询问文件权限,而是询问 FILE 指针使用的访问模式。
self 回答 [由于用户权限限制无法附加单独的答案]:
下面的另一位发帖者有一个更好的答案,其中包含正确的#defines
如前所述,FILE 指针的_flag(在_iobuf 下定义)似乎是了解文件是否只读的关键。虽然你的里程可能会有所不同,但相同的基本概念应该很容易适应,示例代码:
#define READ_ONLY_FLAG 1
bool PrintFlagPtr(const char FileName[], const char AccessMode[])
{
FILE *Ptr = NULL;
Ptr = fopen(FileName,AccessMode);
printf("%s: %d ",AccessMode,Ptr->_flag);
int IsReadOnly = Ptr->_flag;
fclose(Ptr);
Ptr = NULL;
if( (IsReadOnly&READ_ONLY_FLAG) == READ_ONLY_FLAG )
{
printf("File is read only!\n");
return true;
}
printf("\n");
return false;
}
当所有不同的访问模式组合与上述功能一起使用时,会产生以下输出:
Output:
w: 2
r: 1 File is read only!
a: 2
wb: 2
rb: 1 File is read only!
ab: 2
w+: 128
r+: 128
a+: 128
w+b: 128
r+b: 128
a+b: 128
我很好奇为什么从来没有建议(或从未使用过)给定一个交叉兼容的前端函数(只是一个具有相同名称的函数,声明取决于平台)传递一个来自给定 FILE 指针 _flag 将是一个非常简单易行的问题解决方案。
最佳答案
在 Linux(可能还有所有 UNIX 系统)上,您可以使用 fcntl
获取文件的访问模式:
int get_file_status(FILE* f) {
int fd = fileno(f);
return fcntl(fd, F_GETFL);
}
请注意,返回值是一个整数,是 O_RDONLY
或 O_RDWR
等标志的组合,而不是 “r”
或 "w+"
字符串。参见 http://pubs.opengroup.org/onlinepubs/007908799/xsh/open.html对于其中一些标志。
不确定 Windows,请参阅 On Windows/mingw, what is the equivalent of `fcntl(fd, F_GETFL) | O_ACCMODE`? .
关于C文件操作: Check opened file pointer access mode,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7025785/