2012-12-10 15 views
6

Unter Berufung auf the manual hier:dirname() in C: ist das Handbuch falsch?

Die Funktionen dirname() und Basisnamen() bricht einen nullterminierten Pfadnamen Zeichenfolge in dem Verzeichnis und die Dateinamen Komponenten. In der üblichen Fall, dirname() gibt die Zeichenfolge bis zu, aber nicht einschließlich der endgültigen '/', und basename() gibt die Komponente nach dem abschließenden '/' zurück. Nachgestellte '/' Zeichen werden nicht als Teil des Pfadnamens gezählt.

Und später, haben Sie diese kleine Tabelle:

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

Warum dirname("/usr/") kehrt "/" und nicht "/usr"?
Der Satz im Handbuch sagt mir, dass ich als Ergebnis /usr bekommen sollte.
Ich testete das tatsächliche Ergebnis in einem Dummy-Programm und es verhält sich genau wie das Handbuch sagt. Jetzt

#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' 

, was ich erwarten würde, wäre:

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

Also .. jemand versteht, was hier vor sich geht?

Antwort

14

Nachgestellte ‚/‘ Zeichen werden nicht als Teil des Pfadnamens gezählt.

also „/ usr /“ ist das gleiche wie „/ usr“, die eine Datei oder ein Verzeichnis mit dem Namen (Verzeichniseintrag genannt) usr im Verzeichnis / bezeichnen könnte. Die Funktion dirname gibt das übergeordnete Verzeichnis des Pfades zurück. Das übergeordnete Verzeichnis von /usr ist /. Scheint vollkommen konsistent.

+0

+1 Sie haben den entscheidenden Punkt und zitierte es. Zu Ihrer Information gibt es auch eine Interpretation der Austin Group für eine verwandte Ausgabe # 612: http://austingroupbugs.net/view.php?id=612 –

4

Ein Verzeichnis ist auch eine Datei. usr ist natürlich der Basisname der Datei /usr. Dies folgt dem Handbuch genau - in /usr ist die Wurzel / ist das endgültige / und usr ist was folgt, daher ist der Basisname.

Was /usr/ v. /usr, ich vermute, das liegt daran, dass die letzte / immer geschluckt wird und dies wird irgendwo anders angegeben oder fallen unter die „im Normalfall“ Qualifikation. Oder sonst /usr/// und /usr/////////// verweist völlig unterschiedliche Einheiten zu ...