C 文件操作:检查打开的文件指针访问模式

2023-11-27

一个简单的问题:

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

假设一个函数传递了一个已经打开的 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 指针使用的访问模式。

自答[由于用户权限限制,无法附加单独的答案]:

下面的另一张海报有一个更好的答案,其中包括正确的#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 指针的 const int _flag 将是解决该问题的一个非常简单且容易的方法。


在 Linux(可能还有所有 UNIX 系统)上你可以用fcntl获取文件的访问模式:

int get_file_status(FILE* f) {
    int fd = fileno(f);
    return fcntl(fd, F_GETFL);
}

请注意,返回值是一个整数,作为标志的组合,例如O_RDONLY or O_RDWR,不是"r" or "w+"字符串。看http://pubs.opengroup.org/onlinepubs/007908799/xsh/open.html对于其中一些标志。

不确定 Windows 的情况,请参阅在 Windows/mingw 上,`fcntl(fd, F_GETFL) | 等价于什么? O_ACCMODE`?.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C 文件操作:检查打开的文件指针访问模式 的相关文章

随机推荐