C文件操作: Check opened file pointer access mode

标签 c

一个简单的问题:

如何检查已打开文件指针的访问模式?

假设一个函数被传递给一个已经打开的 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_RDONLYO_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/

相关文章:

c结构问题

c - 将数据从内联汇编移动到 C 中的数组

c - 在 c 中杀死 child 后,尝试将变量从 child 添加到父亲时,fork 给出了奇怪的输出

c - 在 if 语句/管理进程中使用 fork

c++ - 如何访问具有多个括号的一维数组以提高可读性?

c - 使用 scanf 读取 small int

c - 带有空指针的动态数组队列数据结构问题

c - 使用结构时跳过 "IF"函数

c - 如何将文件名的输入作为函数的参数?

c - 为 C 字符串编写正则表达式