22

可能重复:
从 C 中的文件描述符
获取文件名 从 C 中的文件指针获取文件名

我在这里有一个功能:

handle_file(FILE *file)
{
    if(condition)
    {
        print filename and other msg;
    }
}

我们在这里唯一知道的是指向文件的指针;是否可以根据指针获取文件名?

4

5 回答 5

24

查看此答案以获取文件描述符,并查看此答案以从文件描述符中获取文件名。在 Linux 上应该没问题(不确定其他操作系统)。

这是一个快速工作示例(在 Cygwin/Win7 下测试):

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>

int main()
{
    int MAXSIZE = 0xFFF;
    char proclnk[0xFFF];
    char filename[0xFFF];
    FILE *fp;
    int fno;
    ssize_t r;

    // test.txt created earlier
    fp = fopen("test.txt", "r");
    if (fp != NULL)
    {
        fno = fileno(fp);
        sprintf(proclnk, "/proc/self/fd/%d", fno);
        r = readlink(proclnk, filename, MAXSIZE);
        if (r < 0)
        {
            printf("failed to readlink\n");
            exit(1);
        }
        filename[r] = '\0';
        printf("fp -> fno -> filename: %p -> %d -> %s\n",
                fp, fno, filename);
    }
    return 0;
}

输出:

fp -> fno -> filename: 0x80010294 -> 3 -> /tmp/test.txt
于 2012-06-27T07:19:27.243 回答
1

这可以分2个阶段完成。首先,您需要获取文件描述符,然后需要恢复文件名。下面是一个例子,但是有一些严重的缓冲区溢出漏洞!

#include <stdio.h>
#include <unistd.h>

char * recover_filename(FILE * f) {
  int fd;
  char fd_path[255];
  char * filename = malloc(255);
  ssize_t n;

  fd = fileno(f);
  sprintf(fd_path, "/proc/self/fd/%d", fd);
  n = readlink(fd_path, filename, 255);
  if (n < 0)
      return NULL;
  filename[n] = '\0';
  return filename;
}
于 2012-06-28T09:34:05.777 回答
-1

否则,如果要分析文件夹中的所有目录和文件,可以使用 opendir 和 struct dirent。这不使用文件指针,但可能对您有用,具体取决于您的代码的工作方式。

DIR *BaseDIR;
struct dirent *curentDir;
BaseDIR = opendir("path/to/the/directory");
while((curentDir = readdir(BaseDIR)) != NULL){
      printf("directory or file name : %s\n",curentDir->d_name);
}
closedir(BaseDIR);
于 2012-06-27T09:09:30.060 回答
-1

正如我搜索的那样,如果您是 root 并且lsof您的系统中存在命令,那么您可以使用fileno(fp)来获取打开文件的描述符,lsof -d descriptor. 你可以试试。

于 2012-06-27T08:26:10.543 回答
-3

我认为这是可能的。
用于fileno(fp)获取描述符。
然后,您可以使用fstat()函数。

The fstat() function shall obtain information about an open file  asso‐
       ciated  with the file descriptor fildes, and shall write it to the area
       pointed to by buf.

int fstat(int fildes, struct stat *buf);

然后,您可以在*buf.

于 2012-06-27T09:00:45.287 回答