7

ここでマニュアルを引用:

関数 dirname() および basename() は、null で終わるパス名文字列をディレクトリとファイル名のコンポーネントに分割します。通常、dirname() は最後の '/' までの文字列を返しますが、これは含まず、 basename() は最後の '/' に続くコンポーネントを返します。末尾の「/」文字は、パス名の一部としてカウントされません。

そして後で、この小さなテーブルがあります:

path         dirname    basename
"/usr/lib"    "/usr"    "lib"
"/usr/"       "/"       "usr"        // wat?
"usr"         "."       "usr"
"/"           "/"       "/"
"."           "."       "."
".."          "."       ".."

なぜdirname( "/usr/")戻っ"/"てくるのではなく"/usr"?マニュアルの文は、結果として
得るべきだと教えてくれます。 実際の結果をダミー プログラムでテストしたところ、マニュアルどおりに動作しました。 /usr

#include <libgen.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int main(int argc, char const *argv[])
{
    const char *mydir="/usr/";
    char *dummy  = strdup( mydir );
    char *dummy2 = strdup( mydir );

    char *dname = dirname( dummy );
    char *bname = basename( dummy2 );


    printf("mydir: '%s', dname: '%s', bname: '%s'\n", mydir, dname, bname);

    free( dummy );
    free( dummy2 );

    return 0;
}


$ ./test  
mydir: '/usr/', dname: '/', bname: 'usr'

さて、私が期待するのは次のとおりです。

path         dirname    basename
"/usr/"       "/usr"       ""        // more consistent?

だから..誰かがここで何が起こっているのか理解していますか?

4

2 に答える 2

15

末尾の「/」文字は、パス名の一部としてカウントされません。

したがって、「/usr/」は「/usr」と同じです。これは、ディレクトリ内の名前 (名前付きのディレクトリ エントリ) を持つファイルまたはディレクトリを表す場合がありusrます/。この関数dirnameは、パスの親ディレクトリを返します。の親ディレクトリ/usr/. 完全に一致しているようです。

于 2012-12-10T16:42:05.223 に答える
4

ディレクトリもファイルです。 usrもちろん、ファイルのベース名です/usr。これはマニュアルに正確に従います -/usrでは、ルート-/は最後/でありusr、それに続くものであるため、ベース名です。

/usr/v.について/usrは、ファイナル/が常に飲み込まれており、これが別の場所で指定されているか、「通常の場合」の資格に該当するためではないかと思います。そう/usr////usr///////////ないと、非常に異なるエンティティを参照することになります...

于 2012-12-10T16:37:53.653 に答える