web-dev-qa-db-fra.com

Nom de fichier? Chemin d'accès? Nom de la base? Norme de nommage pour les morceaux d'un chemin

Je continue à me faire des nœuds lorsque je manipule des chemins et des noms de fichiers, car je n'ai pas de système de nommage commun que j'utilise.

Je dois proposer un standard de nommage et le respecter, et j'aimerais être clair et cohérent avec les autres, je m'ouvre donc pour apprendre les réponses canoniques.

Considérez ce problème de jouet: (exemple de Windows, mais j'espère que la réponse devrait être indépendante de la plate-forme)

Vous avez reçu le nom complet d'un dossier: C:\users\OddThinking\Documents\My Source. Vous voulez parcourir les dossiers en-dessous et compiler tous les fichiers .src en .obj.

À un moment donné, vous regardez la chaîne suivante.

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

Alors, quels noms d'identifiant utiliseriez-vous pour les pièces?

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

Laissez-moi vous donner quelques réponses, pour vous aider à démarrer.

A) nom de base?

B) nom du fichier? Ou est-ce le nom de fichier? La différence est importante lors du choix des noms d'identifiant, et je ne suis jamais cohérent ici.

C) Extension

D) Extension. Attendez, c’est ce que j’ai appelé C. Dois-je éviter de stocker le point et le mettre juste au besoin? Que faire s'il n'y a pas de point sur un fichier particulier?

H) nom du chemin? Ou attendez, est-ce juste le chemin?

I) nom de fichier. Attendez, c'est ce que j'ai appelé C. Path. Attendez, c'est ce que j'ai appelé H. Peut-être que H devrait être le nom du dossier. "Dossier" n'est-il pas un terme spécifique à Windows, cependant?

197
Oddthinking

Je pense que votre recherche d’une convention de dénomination "standard" sera vaine. Voici mes propositions, basées sur des programmes existants bien connus:

A) C:\utilisateurs\OddThinking\Documents\Ma source\Widget \foo.src

Vim appelle le racine du fichier (: help filename-modifiers)

B) C:\utilisateurs\OddThinking\Documents\Ma Source\Widget \foo.src

nom de fichier ou nom de base

C) C:\utilisateurs\OddThinking\Documents\Ma Source\Widget\foo.src  (sans point)

extension de fichier/nom

D) C:\utilisateurs\OddThinking\Documents\Ma Source\Widget\foo.src  (avec un point)

aussi extension de fichier . Stockez simplement sans point, s'il n'y a pas de point sur un fichier, il n'a pas d'extension

E) C:\utilisateurs\OddThinking\Documents\Ma Source \Widget\foo.src

sommet de l'arbre
Pas de convention, git l’appelle le répertoire de base

F) C:\utilisateurs\OddThinking\Documents\Ma Source \Widget\foo.src

chemin du haut de l'arbre à la feuille
chemin relatif

G) C:\utilisateurs\OddThinking\Documents\Ma Source \Widget\ foo.src

un noeud de l'arbre
Pas de convention, peut-être un simple répertoire

H) C:\utilisateurs\OddThinking\Documents\Ma Source\Widget \foo.src

nom du répertoire

JE) C:\utilisateurs\OddThinking\Documents\Ma Source\Widget\foo.src

chemin complet/absol

146
blinry

Bonne question d'abord, mon +1. Cette chose m'a dérangé quand j'ai dû créer une multitude de fonctions dans la classe Utility une fois. GetFileName? ou GetFullName? GetApplicationPath signifie chemin complet ou le nom du répertoire? etc. Je viens de .NET, je pense donc pouvoir ajouter un peu plus à l'excellente réponse de @blinry.

Résumé: (En italique, c'est ce que je n'utiliserais pas en tant que programmeur)

  1. Path : Path spécifie un emplacement unique dans le système de fichiers (sauf si son chemin relatif). Le nom de chemin est moins souvent utilisé, mais je resterais avec chemin - cela explique à peu près ce que c'est. Path peut pointer vers un fichier, un dossier ou même rien (C: \). Le chemin peut être:

    1. Chemin relatif : My Source\Widget\ est le chemin relatif ainsi que Widget\foo.src. Auto-explicatif.
    2. Chemin absolu ou Chemin complet : est le chemin qualifié complet qui pointe vers la cible. J'ai tendance à utiliser ce dernier plus souvent. C:\users\OddThinking\Documents\My Source\Widget\foo.src est donc le chemin complet. Voir à la fin ce que j'appelle chemin complet qui pointe vers un fichier et qui se termine par un répertoire.

    Les noms page wiki et .NET pour le chemin sont cohérents.

  2. Chemin racine ou Répertoire racine: Ancien est la convention .NET alors que celle-ci est plus répandue dans les cercles UNIX Bien que j'aime les deux, j'ai tendance à utiliser l'ancien plus souvent. Dans Windows, contrairement à UNIX, il existe de nombreux chemins racine différents, un pour chaque partition. Les systèmes Unix ont un répertoire racine qui contient des informations sur d'autres répertoires et fichiers. Par exemple. C:\ est le chemin racine.

  3. Dossier ou Nom du dossier : Widget, OddThinking etc dans votre cas. C’est peut-être une convention uniquement Windows (en fait c’est ma propre pensée étrange :)), néanmoins je m’oppose vivement à la réponse de blinry à "Répertoire". Bien que pour un répertoire utilisateur normal signifie identique comme un dossier (comme des sous-dossiers, des sous-répertoires), je pense que sous un angle technique, "répertoire" devrait ressembler à une adresse qualifiée à la cible et non à la cible elle-même. Plus ci-dessous.

    1. Sous-dossiers : En ce qui concerne usersOddThinking et Documents sont des sous-dossiers.
    2. Sous-répertoires : En ce qui concerne usersOddThinking\, OddThinking\Documents\ et OddThinking\Documents\My Source\Widget\ sont des sous-répertoires. Mais nous n'avons pas souvent besoin de nous en préoccuper, n'est-ce pas?
    3. Dossier enfant : En ce qui concerne usersOddThinking est un dossier enfant (ainsi qu'un sous-dossier)
    4. Dossier parent : Pour OddThinkingusers est son dossier parent (mentionnant simplement des terminologies différentes, rien de grave).
  4. Répertoire ou Nom du répertoire : Le premier à utiliser généralement dans la vie réelle, le second à être en code. Cela fait référence au chemin complet (ou simplement chemin complet ) jusqu'au dossier parent de la cible . Dans ton cas, C:\users\OddThinking\Documents\My Source\Widget _ (Oui, un répertoire ne doit jamais désigner un fichier). J'utilise le nom de répertoire dans mon code puisque répertoire est une classe dans .NET et nom de répertoire est ce que la bibliothèque lui-même appelle. C'est tout à fait compatible avec dirname utilisé dans les systèmes UNIX.

  5. Nom du fichier ou Nom du fichier: Nom du fichier avec son extension. Dans ton cas: foo.src. Je dirais que pour un usage non technique, je préfère le nom de fichier (c'est ce que cela signifie pour un utilisateur final) mais, pour des raisons techniques, je m'en tiens strictement avec le nom de base . Le nom de fichier est souvent utilisé par MS , mais je suis surpris de constater à quel point ils ne sont pas cohérents, pas seulement dans la documentation, mais même dans la bibliothèque . Il pourrait désigner le nom de base ou le chemin complet du fichier. Donc, je préfère le nom de base, c'est ce que je les appelle dans le code. Cette page sur le wiki également dit que le nom de fichier peut signifier soit le chemin complet, soit le nom de base. Étonnamment, même en .NET, le nom de base d’utilisation signifie le nom racine du fichier.

  6. Extension ou Extension de nom de fichier ou Extension de fichier : J'aime le dernier. Tout se réfère à la même chose mais qu'est-ce que c'est encore un sujet de débat! Wiki dit que c'est src alors que je me souvenais avoir lu que beaucoup de langues l'interprétaient comme .src. Notez le point. Donc, encore une fois, ma conclusion est que, pour les utilisations occasionnelles, ce n'est pas grave, mais en tant que programmeur, je vois toujours l'extension comme .src.

    Ok, j'aurais peut-être essayé de récupérer des usages standard, mais voici deux de mes conventions que je suis. Et il s'agit de chemins complets.

    1. J'appelle généralement un chemin complet qui pointe vers un fichier sous la forme chemin du fichier. Pour moi, le chemin du fichier est bien défini, il me dit ce que c'est. Bien qu'avec le nom de fichier je le trouve comme nom du fichier, dans mon code je l'appelle le nom de fichier . Cela correspond également à " nom du répertoire ". Sur le plan technique, le nom fait référence au nom complet! Franchement, .NET utilise le terme nom de fichier (j'ai donc mon cas ici) et parfois le chemin du fichier pour cela.

    2. J'appelle un chemin complet qui se termine par un répertoire, un répertoire. En fait, on peut appeler n'importe quel morceau d'adresse qui ne pointe pas vers un fichier ou un répertoire. Alors C:\users\OddThinking\Documents\My Source\ est un directeur, C:\users\OddThinking\ est un répertoire, ou même OddThinking\Documents\My Source\ (il vaut mieux l'appeler sous-répertoire ou même meilleur chemin relatif - tout dépend du contexte avec lequel vous le traitez). Bien ci-dessus, j'ai mentionné quelque chose de différent à propos du répertoire qui est son nom. Voici mon point de vue: je vais prendre un nouveau chemin pour éviter la confusion. Qu'est-ce que c'est D:\Fruit\Apple\Pip\? Un répertoire. Mais si la question est quel est le répertoire ou même meilleur nom de répertoire de D:\Fruit\Apple\Pip\, la réponse est D:\Fruit\Apple\. J'espère que c'est clair.

    Je dirais qu'il vaut mieux ne pas s'inquiéter des deux derniers termes car c'est ce qui crée le plus de confusion (pour moi personnellement). Il suffit d’utiliser le terme chemin complet !

Pour vous répondre:

  1. en ce qui concerne le chemin que vous avez donné

    A) aucune idée. En tout cas, je n'ai jamais eu besoin de l'avoir seul.

    B) nom de base

    C) J'appellerais simplement cela une extension de fichier pour le moment, je suis moins inquiet car je n'ai jamais eu besoin de cela seul pour être nommé dans mon code.

    D) extension de fichier sûrement.

    E) Je ne pense pas que ce soit une exigence générale. Aucune idée. Dans .NET, le répertoire de base est identique au nom du répertoire.

    F) chemin relatif

    G) dossier (dossier parent au nom de base foo.src)

    H) nom du répertoire

    I) chemin complet (ou même nom du fichier)

  2. en général (désolé d'être un peu bavard, juste pour faire passer le message), mais en supposant que foo.src est bien un fichier

    A) NA

    B) nom de base

    C) NA

    D) extension

    E) répertoire ou simplement chemin

    F) chemin relatif

    G) NA

    H) répertoire ou simplement chemin

    I) chemin complet (ou même nom du fichier)

Continuez à conduire avec un exemple de mon côté:

  1. Considérez le chemin C:\Documents and Settings\All Users\Application Data\s.sql.

    1. C:\Documents and Settings\All Users\Application Data\s.sql est le chemin complet (qui est un nom de fichier)
    2. C:\Documents and Settings\All Users\Application Data\ est le nom du répertoire.
  2. Considérons maintenant le chemin C:\Documents and Settings\All Users\Application Data

    1. C:\Documents and Settings\All Users\Application Data est le chemin complet (qui se trouve être un répertoire)
    2. C:\Documents and Settings\All Users est le nom du répertoire.

Deux de mes astuces:

  1. Je suis la règle générale qui veut que, lorsqu'il s'agit d'adresser une adresse complète quel que soit son type, je l'appelle presque toujours "chemin complet". Cela élimine non seulement l'utilisation de deux terminologies pour le chemin de fichier et le chemin de dossier, cela évite également la confusion potentielle si vous allez nommer le fichier en tant que nom de fichier (qui, pour la plupart des utilisateurs, se traduit immédiatement par nom de base). Mais oui, si vous devez préciser le type de chemin, il est préférable de nommer ensuite le nom du fichier ou le répertoire plutôt que le "chemin" plus générique.

  2. Quoi que vous fassiez, vous auriez votre propre idée en tête, vous vous y conformerez tout au long. Avoir un consensus parmi les membres de l'équipe sur le fait que cela signifie ceci et non cela.

Maintenant que je viens du cercle, j'ai un peu de pratique. Une nouvelle marque de termes serait celle qui est utilisée sous OS X et Android machines. Et ce ne sont que des chemins physiques dans un système de fichiers. Un tout nouvel ensemble de terminologies apparaîtrait dans le cas des adresses Web. J'attends que quelqu'un comble le vide dans ce même fil :) Je serais heureux d'entendre la convention avec laquelle vous êtes allé de l'avant.

33
nawfal

En C++, Boost.Filesystem a mis au point une nomenclature pour les différentes parties d’un chemin. Voir la documentation de référence chemin d'accès pour plus de détails, ainsi que ceci tutoriel .

Voici un résumé basé sur le tutoriel. Pour:

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

vous recevez:

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

Norme C++ ISO/IEC 14882: 2017

De plus, la terminologie Boost.Filesystem a été adoptée par C++ 17 => Voir std::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
23
Emile Cormier

Non, vous n'êtes pas fou.

Dans les systèmes Windows, parfois le chemin du répertoire contenant le fichier est appelé chemin, ce qui a été le cas depuis le début. Donc, par exemple,

    x:\dir1\dir2\myfile.txt

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

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

L'approche Unix/Linux est beaucoup plus logique, et c'est ce que tout le monde a mentionné ci-dessus: chemin d'accès incluant le nom du fichier lui-même. Cependant, si vous tapez "call /?" dans la ligne de commande Windows, vous obtenez ceci:

    %~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

Donc, voilà, "chemin uniquement" et "nom de fichier uniquement". Dans le même temps, ils font référence à la chaîne entière en tant que "nom de chemin complet", ce qui est compris comme lettre de lecteur, chemin d'accès et nom de fichier. Donc, il n'y a pas de vraie vérité. C'est futile. Vous avez été trahi.

En tous cas,

Pour répondre à ta question

Voici comment je nommerais vos exemples:

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

A-D-E-F n'a pas de surnoms simples. Et comme le php est probablement le langage multi-plateformes le plus connu, tout le monde comprend le "nom de base" et le "nom du répertoire", donc je m'en tiens à cette dénomination. Le nom complet est également évident; chemin complet serait un peu ambigu, mais la plupart du temps, cela signifie exactement la même chose.

6
dkellner

Je pense que la bibliothèque standard pathlib de Python a une excellente convention de nommage pour les composants de chemin: https://docs.python.org/3/library/pathlib.html

a) C:\utilisateurs\OddThinking\Documents\Ma Source\Widget \foo.src

tige

b) C:\utilisateurs\OddThinking\Documents\Ma source\Widget \foo.src

prénom

c) C:\utilisateurs\OddThinking\Documents\Ma Source\Widget\foo.src  (sans point)

[rien]

d) C:\utilisateurs\OddThinking\Documents\Ma Source\Widget\foo.src  (avec un point)

suffixe

e) C:\utilisateurs\OddThinking\Documents\Ma Source \Widget\foo.src

chemin grand parent

f) C:\utilisateurs\OddThinking\Documents\Ma source \Widget\foo.src

chemin relatif au chemin grand parent

g) C:\utilisateurs\OddThinking\Documents\Ma source \Widget\ foo.src

nom du parent

h) C:\utilisateurs\OddThinking\Documents\Ma Source\Widget \foo.src

chemin parent

je) C:\utilisateurs\OddThinking\Documents\Ma Source\Widget\foo.src

chemin

1
Maggyero