Dateiname? Pfadname? Basisname? Benennungsstandard für Teile eines Pfades

228

Wenn ich Pfade und Dateinamen manipuliere, gerate ich immer wieder in Knoten, weil ich kein gemeinsames Benennungssystem habe, das ich verwende.

Ich muss mir einen Namensstandard ausdenken und mich daran halten, und ich möchte klar und konsequent mit anderen sein, also öffne ich mich, um die kanonischen Antworten zu lernen.

Betrachten Sie dieses Spielzeugproblem: (Windows-Beispiel, aber hoffentlich sollte die Antwort plattformunabhängig sein)

Sie haben den vollständigen Namen eines Ordners erhalten: C: \ users \ OddThinking \ Documents \ My Source. Sie möchten die darunter liegenden Ordner durchsuchen und alle .src zu .obj kompilieren.

Irgendwann sehen Sie sich die folgende Zeichenfolge an.

C:\users\OddThinking\Documents\My Source\Widget\foo.src

Welche Bezeichnernamen würden Sie für die Teile verwenden?

A) foo
B) foo.src
C) src
D) .src
E) C:\users\OddThinking\Documents\My Source\ - i.e. the top of the tree.
F) Widget\foo.src - i.e. the path from the top of the tree to the leaf.
G) Widget - i.e. one node of the tree.
H) C:\users\OddThinking\Documents\My Source\Widget\ - i.e. the name of the folder
I) C:\users\OddThinking\Documents\My Source\Widget\foo.src

Lassen Sie mich einige Antworten geben, um Ihnen den Einstieg zu erleichtern.

A) Basisname?

B) Dateiname? Oder ist es Dateiname? Der Unterschied ist wichtig bei der Auswahl von Bezeichnernamen, und ich bin hier nie konsistent.

C) Verlängerung

D) Verlängerung. Warten Sie, so habe ich C genannt. Sollte ich es vermeiden, den Punkt zu speichern, und ihn bei Bedarf einfach eingeben? Was ist, wenn eine bestimmte Datei keinen Punkt enthält?

H) Pfadname? Oder warten Sie, ist es nur der Weg?

I) Dateiname. Warten Sie, so habe ich C. Path genannt. Warten Sie, so habe ich H genannt. Vielleicht sollte H der Ordnername sein. Ist "Ordner" jedoch kein Windows-spezifischer Begriff?

Seltsames Denken
quelle
Mike Pope, technischer Redakteur bei Microsoft, weist in seinem Blog darauf hin, dass der Microsoft Style Guide zwar konsequent zwei Wörter enthält: Dateiname, Ordnername, Datenträgername, der Apple Style Guide jedoch manchmal: Dateiname, Pfadname, Datenträgername .
Oddthinking
A) sollte definitiv nicht als Basisname bezeichnet werden, da der Basisname an vielen Stellen bereits als letztes Element in einem Pfad verwendet wird (für eine Datei wäre dies der Dateiname ohne Verzeichnispfad). Einige Orte nennen den Dateinamen ohne Erweiterung das stem.
wisbucky
Gibt es für Dateien mit mehreren Punkten (z. B. foo.src.txt) eine Standardmethode zum Identifizieren (und Benennen) der Erweiterung (en)?
user117529

Antworten:

178

Ich denke, Ihre Suche nach einer "Standard" -Namenskonvention wird vergebens sein. Hier sind meine Vorschläge, die auf bestehenden, bekannten Programmen basieren:

A) C: \ Benutzer \ OddThinking \ Dokumente \ Meine Quelle \ Widget \ foo .src

Vim nennt es Dateistamm (: Hilfe Dateinamen-Modifikatoren)

B) C: \ Benutzer \ OddThinking \ Dokumente \ Meine Quelle \ Widget \ foo.src

Dateiname oder Basisname

C) C: \ Benutzer \ OddThinking \ Dokumente \ Meine Quelle \ Widget \ foo. src (ohne Punkt)

Datei- / Namenserweiterung

D) C: \ Benutzer \ OddThinking \ Dokumente \ Meine Quelle \ Widget \ foo .src (mit Punkt)

auch Dateierweiterung . Einfach ohne Punkt speichern. Wenn eine Datei keinen Punkt enthält, hat sie keine Erweiterung

E) C: \ Benutzer \ OddThinking \ Dokumente \ Meine Quelle \ Widget \ foo.src

oben im Baum
Keine Konvention, Git nennt es Basisverzeichnis

F) C: \ Benutzer \ OddThinking \ Dokumente \ Meine Quelle \ Widget \ foo.src

Pfad von der Spitze des Baumes zum
relativen Pfad des Blattes

G) C: \ Benutzer \ OddThinking \ Dokumente \ Meine Quelle \ Widget \ foo.src

ein Knoten des Baumes
keine Konvention, vielleicht ein einfaches Verzeichnis

H) C: \ Benutzer \ OddThinking \ Dokumente \ Meine Quelle \ Widget \ foo.src

dir name

I) C: \ Benutzer \ OddThinking \ Dokumente \ Meine Quelle \ Widget \ foo.src

voller / absoluter Pfad

blinry
quelle
8
Es wird nicht mehr zum Thema, aber seien Sie vorsichtig, wenn Sie die Erweiterung getrennt vom Punkt speichern. Sie müssen die Dateinamen "foo", "foo" verarbeiten. und "foo.txt" (und sogar "foo.txt.bak".)
Oddthinking
1
Hallo Leute, tolles Beispiel. Es wäre einfacher zu lesen, wenn Sie die Antwort neben die Frage stellen, anstatt Referenzen zu verwenden, die einen Bildlauf nach oben erzwingen. Ich mache übrigens eine Bearbeitung, um das zu verbessern. Grettings
Victor
3
Victor, da deine Bearbeitung abgelehnt wurde (wtf Leute, das ist eine sehr gute Verbesserung!),
Habe
1
Für 1.(Dateiname nur ohne Erweiterung) habe ich mich vor File Titlelanger Zeit entschieden, weil es keine klare Konvention oder zumindest keinen globalen Konsens gibt.
Polyvertex
1
Für A(Dateiname ohne Erweiterung) können Sie verwenden stem. Referenzen: doc.rust-lang.org/std/path/struct.Path.html#method.file_stem , llvm.org/docs/doxygen/html/… , boost.org/doc/libs/1_60_0/libs/filesystem/ doc /…
wisbucky
36

Gute Frage zuallererst, meine +1. Dieses Ding hat mich gestört, als ich einmal eine Reihe von Funktionen in der Utility-Klasse erstellen musste. GetFileName? oder GetFullName? GetApplicationPath bedeutet vollständiger Pfad oder Verzeichnisname? und so weiter. Ich komme aus dem .NET-Hintergrund, daher denke ich, dass ich der ansonsten hervorragenden Antwort von @blinry etwas mehr hinzufügen kann.

Zusammenfassung: (Kursiv ist das, was ich als Programmierer nicht verwenden würde)

  1. Pfad : Der Pfad gibt einen eindeutigen Speicherort im Dateisystem an (außer dem relativen Pfad). Der Pfadname wird seltener verwendet, aber ich würde mich an den Pfad halten - er erklärt ziemlich genau, was er ist. Der Pfad kann auf eine Datei oder einen Ordner oder gar nichts verweisen (C: \). Pfad kann sein:

    1. Relativer Pfad : My Source\Widget\ist sowohl der relative Pfad als auchWidget\foo.src . Selbsterklärend.
    2. Absoluter Pfad oder vollständiger Pfad : Ist der vollständig qualifizierte Pfad, der auf das Ziel zeigt. Letzteres benutze ich eher. C:\users\OddThinking\Documents\My Source\Widget\foo.srcist daher voller Weg. Sehen Sie am Ende, was ich als vollständigen Pfad bezeichne, der auf eine Datei verweist und als Verzeichnis endet.

    Die Wiki-Seite und die .NET-Benennung für den Pfad sind konsistent.

  2. Stammpfad oder Stammverzeichnis : Ersteres ist die .NET-Konvention, während letzteres in UNIX-Kreisen häufiger zu hören ist. Obwohl ich beide mag, benutze ich eher die ersteren. In Windows gibt es im Gegensatz zu UNIX viele verschiedene Stammpfade, einen für jede Partition. Unix-Systeme haben ein Stammverzeichnis, das Informationen zu anderen Verzeichnissen und Dateien enthält. Z.B. C:\ist der Wurzelpfad.

  3. Ordner oder Ordnername : Widget, OddThinkingusw. in Ihrem Fall. Dies könnte eine Konvention nur für Windows sein (in der Tat ist es mein eigenes seltsames Denken :)), dennoch lehne ich die Antwort von blinry "Directory" nachdrücklich ab. Obwohl ein normales Benutzerverzeichnis dasselbe bedeutet wie ein Ordner (wie Unterordner, Unterverzeichnisse), sollte "Verzeichnis" aus technischer Sicht wie eine qualifizierte Adresse für das Ziel und nicht für das Ziel selbst klingen. Mehr unten.

    1. Unterordner : In Bezug auf users OddThinkingundDocuments sind Unterordner.
    2. Unterverzeichnisse : In Bezug auf users OddThinking\, OddThinking\Documents\undOddThinking\Documents\My Source\Widget\ sind Unterverzeichnisse. Aber wir müssen uns nicht oft darum kümmern, oder?
    3. Untergeordneter Ordner : In Bezug aufusers OddThinking ist ein untergeordneter Ordner (sowie Unterordner)
    4. Übergeordneter Ordner : Für OddThinking usersist der übergeordnete Ordner (nur verschiedene Terminologien erwähnen, keine große Sache).
  4. Verzeichnis oder Verzeichnisname : Ersteres wird allgemein im wirklichen Leben verwendet, letzteres wird im Code verwendet. Dies bezieht sich auf den vollständig qualifizierten Pfad (oder einfach den vollständigen Pfad ) bis zum übergeordneten Ordner des Ziels . In Ihrem Fall C:\users\OddThinking\Documents\My Source\Widget(Ja, ein Verzeichnis soll niemals auf eine Datei verweisen). Ich verwende den Verzeichnisnamen in meinem Code, da Verzeichnis eine Klasse in .NET ist und Verzeichnisname das ist, was die Bibliothek selbst nennt. Es stimmt ziemlich gut mit dem in UNIX-Systemen verwendeten Verzeichnisnamen überein .

  5. Dateiname oder Basisname : Name der Datei zusammen mit der Erweiterung. In Ihrem Fall : foo.src. Ich würde sagen, dass ich für eine nicht technische Verwendung den Dateinamen bevorzuge (was es für einen Endbenutzer bedeutet), aber für technische Zwecke würde ich mich strikt an den Basisnamen halten . Dateiname wird häufig von MS verwendet, aber ich bin überrascht, dass sie nicht nur in der Dokumentation, sondern auch in der Bibliothek konsistent sind . Dort kann Dateiname entweder Basisname oder vollständiger Pfad der Datei bedeuten. Also bevorzuge ich den Basisnamen, so nenne ich sie im Code. Diese Seite im Wiki sagt auch, dass der Dateiname entweder den vollständigen Pfad oder den Basisnamen bedeuten kann. Überraschenderweise kann ich sogar in .NET den Verwendungsbasisnamen finden, der den Stammnamen der Datei bedeutet.

  6. Erweiterung oder Dateierweiterung oder Dateierweiterung : Ich mag die letzte. Alles bezieht sich auf dasselbe, aber was es ist, ist wieder eine Frage der Debatte! Das Wiki sagt, dass srcich mich damals daran erinnere, dass viele der Sprachen es so interpretiert haben .src. Beachten Sie den Punkt. Ich nehme also wieder einmal an, für gelegentliche Zwecke spielt es keine Rolle, was es ist, aber als Programmierer sehe ich Erweiterung immer als .src.

    Ok, ich habe vielleicht versucht, einige Standardverwendungen abzurufen, aber hier sind zwei meiner Konventionen, denen ich folge. Und es geht um volle Wege.

    1. Im Allgemeinen nenne ich einen vollständigen Pfad, der auf eine Datei verweist, als Dateipfad . Für mich ist der Dateipfad eindeutig und sagt mir, was er ist. Obwohl ich den Dateinamen als Dateinamen finde, nenne ich ihn in meinem Code Dateiname . Es ist auch konsistent mit " Verzeichnisname ". Von der technischen Seite bezieht sich der Name auf den vollständig qualifizierten Namen! Frustrierenderweise verwendet .NET den Begriff Dateiname (daher habe ich hier meinen Fall) und manchmal den Dateipfad dafür.

    2. Ich nenne einen vollständigen Pfad, der als Verzeichnis endet, ein Verzeichnis. Tatsächlich kann man jede Adresse, die nicht auf eine Datei verweist, als Verzeichnis bezeichnen. So C:\users\OddThinking\Documents\My Source\ist ein Verzeichnis, C:\users\OddThinking\ist ein Verzeichnis oder sogar OddThinking\Documents\My Source\(besser es Unterverzeichnis oder noch besser relativer Pfad zu nennen - alles, was von dem Kontext abhängt, mit dem Sie es zu tun haben). Gut oben habe ich etwas anderes über das Verzeichnis erwähnt, nämlich den Verzeichnisnamen. Hier ist meine Meinung dazu: Ich werde einen neuen Weg finden, um Verwirrung zu vermeiden. Was ist das D:\Fruit\Apple\Pip\? Ein Verzeichnis. Aber wenn die Frage ist, wie lautet das Verzeichnis oder noch besser der Verzeichnisname D:\Fruit\Apple\Pip\, lautet die Antwort D:\Fruit\Apple\. Hoffe es ist klar.

    Ich würde sagen, es ist besser, sich keine Sorgen um die letzten beiden Begriffe zu machen, da dies (für mich persönlich) die größte Verwirrung stiftet. Verwenden Sie einfach den Begriff vollständiger Pfad !

Um Ihnen zu antworten:

  1. in Bezug auf den Weg, den Sie gegeben haben

    A) Keine Ahnung. Jedenfalls musste ich diesen nie alleine bekommen.

    B) Basisname

    C) Ich würde es vorerst nur als Dateierweiterung bezeichnen. Ich mache mir am wenigsten Sorgen, da ich das nie alleine brauchte, um es in meinem Code zu benennen.

    D) Dateierweiterung sicher.

    E) Ich denke nicht, dass dies eine allgemeine Anforderung ist. Keine Ahnung. In .NET ist das Basisverzeichnis mit dem Verzeichnisnamen identisch.

    F) relativer Pfad

    G) Ordner (übergeordneter Ordner zum Basisnamen foo.src )

    H) Verzeichnisname

    I) vollständiger Pfad (oder sogar Dateiname)

  2. im Allgemeinen (tut mir leid, dass ich ein bisschen wortreich bin, nur um den Punkt nach Hause zu bringen), aber vorausgesetzt foo.src handelt sich tatsächlich um eine Datei

    A) NA

    B) Basisname

    C) NA

    D) Verlängerung

    E) Verzeichnis oder einfach Pfad

    F) relativer Pfad

    G) NA

    H) Verzeichnis oder einfach Pfad

    I) vollständiger Pfad (oder sogar Dateiname)

Weiter fahren mit einem Beispiel von meiner Seite:

  1. Betrachten Sie den Pfad C:\Documents and Settings\All Users\Application Data\s.sql.

    1. C:\Documents and Settings\All Users\Application Data\s.sql ist der vollständige Pfad (der ein Dateiname ist)
    2. C:\Documents and Settings\All Users\Application Data\ ist der Verzeichnisname.
  2. Betrachten Sie nun den Pfad C:\Documents and Settings\All Users\Application Data

    1. C:\Documents and Settings\All Users\Application Data ist der vollständige Pfad (der zufällig ein Verzeichnis ist)
    2. C:\Documents and Settings\All Users ist der Verzeichnisname.

Zwei meiner Tipps:

  1. Ich befolge diese Faustregel: Wenn es darum geht, eine vollständige Adresse unabhängig von ihrem Typ zu adressieren, nenne ich sie fast immer "vollständiger Pfad". Dies eliminiert nicht nur die Verwendung von zwei Terminologien für Dateipfad und Ordnerpfad, sondern vermeidet auch die mögliche Verwirrung, wenn Sie die Datei als Dateinamen benennen (was für die meisten Benutzer sofort in einen Basisnamen übersetzt wird). Aber ja, wenn Sie den Pfadtyp genau angeben müssen, ist es besser, den Dateinamen oder das Verzeichnis anstelle des allgemeineren "Pfads" zu benennen.

  2. Was auch immer es ist, Sie würden Ihre eigene Idee im Sinn haben, seien Sie durchweg damit einverstanden. Haben Sie unter den Teammitgliedern einen Konsens darüber, dass dies dies und nicht das bedeutet.

Jetzt, wo ich nur aus dem Kreis komme, habe ich etwas Übung. Eine neue Marke von Begriffen wäre das, was auf OS X- und Android-Computern verwendet wird. Und all dies sind nur physische Pfade im Dateisystem. Bei Webadressen würde sich eine völlig neue Terminologie ergeben. Ich erwarte, dass jemand die Lücke in demselben Thread füllt :) Ich würde mich freuen, die Konvention zu hören, mit der Sie fortgefahren sind.

nawfal
quelle
Ich habe lange Zeit das Wort "Pfadname" verwendet, um den gesamten absoluten Pfad einschließlich des vollständigen Dateinamens zu bezeichnen. Ihre Antwort, andere hier und andere Ressourcen haben meine Meinung dazu geändert, und jetzt verwende ich das Wort "vollständiger Pfad" dafür, "Pfad" für den Speicherort ohne Dateinamen und "Dateiname" oder "Name" für den Dateinamen selbst.
Nate
24

In C ++ hat Boost.Filesystem eine Nomenklatur für die verschiedenen Teile eines Pfads entwickelt. Siehe den Weg Zersetzung Referenzdokumentation für Details, sowie dieses Tutorial .

Hier ist eine Zusammenfassung basierend auf dem Tutorial. Zum:

  • Windows-Pfad: c:\foo\bar\baa.txt
  • Unix-Pfad: /foo/bar/baa.txt

du erhältst:

Part            Windows          Posix
--------------  ---------------  ---------------
Root name       c:               <empty>
Root directory  \                /
Root path       c:\              /
Relative path   foo\bar\baa.txt  foo/bar/baa.txt
Parent path     c:\foo\bar       /foo/bar
Filename        baa.txt          baa.txt
Stem            baa              baa
Extension       .txt             .txt

C ++ - Standard ISO / IEC 14882: 2017

Darüber hinaus wurde die Boost.Filesystem-Terminologie von C ++ 17 übernommen => Siehestd::filesystem

Function name     Meaning
----------------  -------------------------------
root_name()       Root-name of the path
root_directory()  Root directory of the path
root_path()       Root path of the path
relative_path()   Path relative to the root path
parent_path()     Path of the parent path
filename()        Path without base directory (basename)
stem()            Filename without extension
extension()       Component after last dot
Emile Cormier
quelle
6
Wie nennen sie das Ganze dann? path, fullpath?
wisbucky
@wisbucky Das Ganze wird in ihrer Nomenklatur "Pfad" genannt.
Emile Cormier
1
@wisbucky Der Link wurde behoben. Vielen Dank.
Emile Cormier
@olibre: Danke für das C ++ 17 Update. Ist stem()aber ein Teil des Dateinamens , nicht der Pfad .
Emile Cormier
1
@ johnc.j. Es ist schade, Boost.Filesystem war nicht so bekannt, als die Frage zum ersten Mal gestellt wurde. Ich würde lieber die Nomenklatur einer von Experten geprüften Bibliothek übernehmen, als mir selbst etwas auszudenken.
Emile Cormier
9

Die pathlibStandardbibliothek von Python bietet eine hervorragende Namenskonvention für Pfadkomponenten: https://docs.python.org/3/library/pathlib.html

a) C: \ Benutzer \ OddThinking \ Dokumente \ Meine Quelle \ Widget \ foo .src

Stengel

b) C: \ Benutzer \ OddThinking \ Dokumente \ Meine Quelle \ Widget \ foo.src

Name

c) C: \ Benutzer \ OddThinking \ Dokumente \ Meine Quelle \ Widget \ foo. src (ohne Punkt)

[nichts]

d) C: \ Benutzer \ OddThinking \ Dokumente \ Meine Quelle \ Widget \ foo .src (mit Punkt)

Suffix

e) C: \ Benutzer \ OddThinking \ Dokumente \ Meine Quelle \ Widget \ foo.src

Großelternpfad

f) C: \ Benutzer \ OddThinking \ Dokumente \ Meine Quelle \ Widget \ foo.src

relativer Pfad zum Pfad der Großeltern

g) C: \ Benutzer \ OddThinking \ Dokumente \ Meine Quelle \ Widget \ foo.src

elternname

h) C: \ Benutzer \ OddThinking \ Dokumente \ Meine Quelle \ Widget \ foo.src

übergeordneter Pfad

i) C: \ Benutzer \ OddThinking \ Dokumente \ Meine Quelle \ Widget \ foo.src

Pfad

Maggyero
quelle
8

Nein, du bist nicht verrückt.

In Windows-Systemen wird der Pfad des Verzeichnisses, in dem sich die Datei befindet , manchmal als Pfad bezeichnet , so wie es von Anfang an war. So zum Beispiel

    x:\dir1\dir2\myfile.txt

    Windows:
    --------
        PATH:  x:\dir1\dir2
        FILE:  myfile.txt

    Unix/Linux:
    -----------
        PATH:  /dir1/dir2/myfile.txt
        FILE:  myfile.txt

Der Unix / Linux-Ansatz ist viel logischer, und das haben alle oben erwähnt: Pfad einschließlich des Dateinamens selbst. Wenn Sie jedoch "call /?" In der Windows-Befehlszeile erhalten Sie Folgendes:

    %~1         - expands %1 removing any surrounding quotes (")
    %~f1        - expands %1 to a fully qualified path name
    %~d1        - expands %1 to a drive letter only
    %~p1        - expands %1 to a path only
    %~n1        - expands %1 to a file name only
    %~x1        - expands %1 to a file extension only

Es gibt also "nur Pfad" und "nur Dateiname". Gleichzeitig bezeichnen sie die gesamte Zeichenfolge als "vollständig qualifizierten Pfadnamen", der als Laufwerksbuchstabe plus Pfad plus Dateiname verstanden wird. Es gibt also keine wirkliche Wahrheit. Es ist zwecklos. Du wurdest betrogen.

Wie auch immer,

Zur Beantwortung Ihrer Frage

So würde ich Ihre Beispiele nennen:

A: -
B: basename
C: extension
D: -
E: -
F: -
G: -
H: pathname (or dirname or containing path)
I: full name

ADEF haben keine einfachen Spitznamen. Und da PHP wahrscheinlich die bekannteste plattformübergreifende Sprache ist, versteht jeder "Basisname" und "Verzeichnisname", also würde ich mich an diese Benennung halten. Der vollständige Name ist ebenfalls offensichtlich. Der vollständige Pfad wäre etwas mehrdeutig, aber meistens bedeutet er genau dasselbe.

dkellner
quelle
1
Ich habe lange Zeit das Wort "Pfadname" verwendet, um den gesamten absoluten Pfad einschließlich des vollständigen Dateinamens zu bezeichnen. Andere Antworten hier und Ressourcen an anderer Stelle haben meine Meinung dazu geändert, und jetzt verwende ich das Wort "vollständiger Pfad" dafür, "Pfad" für den Speicherort ohne Dateinamen und "Dateiname" oder "Name" für den Dateinamen selbst.
Nate