4

基本的に、このコードはディレクトリ内のファイルの名前を提供します....しかし、代わりにそれらのパスを取得する必要があります..関数 realpath() を使用しようとしました。しかし、私はそれを間違って使用していると思います(コードで使用したい場所を示しました)。それを修正する方法はありますか?もう 1 つ: サブディレクトリの名前しか表示されませんが、基本的にはそれらのファイルのパスも取得する必要があります。ありがとうございます。

#include <stdio.h>
#include <dirent.h>
#include <stdlib.h>
#include <sys/stat.h>
#include <unistd.h>

int main (int c, char *v[]) {
    int len, n;
    struct dirent *pDirent;
    DIR *pDir;
    int ecode=0;
    struct stat dbuf;
    for (n=1; n<c; n++){
        if (lstat(v[n], &dbuf) == -1){
            perror (v[n]);
            ecode ++;
        }
        else if(S_ISDIR(dbuf.st_mode)){
            printf("%s is a directory/n ", v[n]);
        }
        else{
            printf("%s is not a directory\n", v[n]);
        }
    }
    if (c < 2) {
        printf ("Usage: testprog <dirname>\n");
        return 1;
    }
    pDir = opendir (v[1]);
    if (pDir == NULL) {
        printf ("Cannot open directory '%s'\n", v[1]);
        return 1;
    }

    while ((pDirent = readdir(pDir)) != NULL) {
        // here I tried to use realpath()
        printf ("[%s]\n", realpath(pDirent->d_name));
    }
    closedir (pDir);
    return 0;
}
4

1 に答える 1

2

2 番目の引数を realpath に追加するだけで済みます。これは、書き込み先のバッファーが必要だからです。printf ステートメントから行を取り出して、独自の行にすることをお勧めします。realpath()はchar* を返すことができますが、そのように設計されていません。

#include <limits.h>       //For PATH_MAX

char buf[PATH_MAX + 1]; 
while ((pDirent = readdir(pDir)) != NULL) {
    realpath(pDirent->d_name, buf);
    printf ("[%s]\n", buf);
}

これにより、システム上で完全なパスが正しく表示されるようです。

于 2013-10-28T22:28:51.857 に答える