【问题标题】:Getting the file-mode from the FILE struct?从 FILE 结构中获取文件模式?
【发布时间】:2015-04-19 15:10:42
【问题描述】:

我有一段 C 代码,一个具体的函数,它在 FILE* 上运行。

根据打开FILE* 的模式,有些事情我可以做,也不能做。

有什么方法可以获得FILE*打开的模式吗?

FILE* 是我可以依赖的所有信息,因为它是在程序中的其他地方创建的,实际文件名在它到达我的函数之前早已丢失,我无法影响。

我更喜欢便携式解决方案。

编辑:我对指定哪些用户可以对文件执行什么操作的文件限制不感兴趣。这几乎无关紧要,因为它是在打开文件时处理的。对于这段代码,我只关心开放模式。

【问题讨论】:

  • 它在特定的操作系统上吗?或者您想要一个可移植的跨平台解决方案?
  • 你怎么可能忘记?使用变量。
  • 问题是文件是在我无权修改的程序的一部分中打开的。所以我不会“忘记”,只是在我的函数运行时该信息不可用。我知道这很愚蠢,但我无法从头到尾解决它。
  • 请注意,在 POSIX-ish 系统上,您可以使用可读写的文件描述符创建文件,但磁盘上文件的权限可能限制为 000(无法访问任何不是root的人)。从问题中不清楚您是在询问“磁盘上”模式(由chmod()open()creat() 设置),还是在询问“文件描述符模式”(由open() 确定并可通过fcntl() 修改)。如果您确定了您可以做和不能做的不同事情,那么准确回答会更容易。
  • @JonathanLeffler:OP 明确要求“打开 FILE* 的模式”,而不是关于权限的任何内容。

标签: c++ c file-io


【解决方案1】:

在 POSIX(和足够相似的)系统上,fcntl(fileno(f), F_GETFL) 将以传递给open(而不是fopen)的形式返回打开文件的模式/标志。要检查它是否以只读、读写或只写的方式打开,您可以执行以下操作:

int mode = fcntl(fileno(f), F_GETFL);
switch (mode & O_ACCMODE) {
case O_RDONLY: ...
case O_WRONLY: ...
case O_RDWR: ...
}

您还可以检查O_APPEND等标志。

【讨论】:

  • 请注意,即使打开文件进行写入,如果文件不为空且使用O_APPEND打开,则不能在文件开头写入。
  • @Jonathan 正是这样的事情,这就是为什么能够导出文件的打开模式对我来说很重要
【解决方案2】:

假设 Linux/Unix:

查看fstat(),获取文件权限的详细信息。

要获取该函数的文件描述符,我们 fileno()

【讨论】:

  • 这不是对 OP 问题的回答。请参阅我对马聪的回答的评论。
猜你喜欢
  • 2011-04-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多