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

私が検索したように、あなたがルートであり、コマンドlsofがシステムに存在する場合は、を使用fileno(fp)して、開いているファイルの記述子を取得できますlsof -d descriptor。あなたはそれを試すことができます。

于 2012-06-27T08:26:10.543 に答える
-1

それ以外の場合、フォルダ内のすべてのディレクトリとファイルを分析する場合は、opendirとstructdirentを使用できます。これはファイルポインタを使用していませんが、コードがどのように機能しているかによっては、役立つ場合があります。

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 に答える
-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 に答える