29 Input/output library [input.output]

29.11 File systems [filesystems]

29.11.7 Class path [fs.class.path] Generic pathname format [fs.path.generic]

	root-name root-directory relative-path
	operating system dependent sequences of characters
	implementation-defined sequences of characters
	filename directory-separator relative-path
	an empty path
	non-empty sequence of characters other than directory-separator characters
	preferred-separator directory-separator
	fallback-separator directory-separator
	operating system dependent directory separator character
	/, if preferred-separator is not /
A filename is the name of a file.
The dot and dot-dot filenames, consisting solely of one and two period characters respectively, have special meaning.
The following characteristics of filenames are operating system dependent:
  • The permitted characters.
    : Some operating systems prohibit the ASCII control characters (0x00 – 0x1F) in filenames. — end example
    : For wide portability, users may wish to limit filename characters to the POSIX Portable Filename Character Set:
    A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
    a b c d e f g h i j k l m n o p q r s t u v w x y z
    0 1 2 3 4 5 6 7 8 9 .- — end note
  • The maximum permitted length.
  • Filenames that are not permitted.
  • Filenames that have special meaning.
  • Case awareness and sensitivity during path resolution.
  • Special rules that may apply to file types other than regular files, such as directories.
Except in a root-name, multiple successive directory-separator characters are considered to be the same as one directory-separator character.
The dot filename is treated as a reference to the current directory.
The dot-dot filename is treated as a reference to the parent directory.
What the dot-dot filename refers to relative to root-directory is implementation-defined.
Specific filenames may have special meanings for a particular operating system.
A root-name identifies the starting location for pathname resolution ([fs.class.path]).
If there are no operating system dependent root-names, at least one implementation-defined root-name is required.
Many operating systems define a name beginning with two directory-separator characters as a root-name that identifies network or other resource locations.
Some operating systems define a single letter followed by a colon as a drive specifier – a root-name identifying a specific device such as a disk drive.
— end note
If a root-name is otherwise ambiguous, the possibility with the longest sequence of characters is chosen.
On a POSIX-like operating system, it is impossible to have a root-name and a relative-path without an intervening root-directory element.
— end note
Normalization of a generic format pathname means:
  1. 1.
    If the path is empty, stop.
  2. 2.
    Replace each slash character in the root-name with a preferred-separator.
  3. 3.
    The generic pathname grammar ([fs.path.generic]) defines directory-separator as one or more slashes and preferred-separators.
    — end note
  4. 4.
    Remove each dot filename and any immediately following directory-separator.
  5. 5.
    As long as any appear, remove a non-dot-dot filename immediately followed by a directory-separator and a dot-dot filename, along with any immediately following directory-separator.
  6. 6.
    If there is a root-directory, remove all dot-dot filenames and any directory-separators immediately following them.
    These dot-dot filenames attempt to refer to nonexistent parent directories.
    — end note
  7. 7.
    If the last filename is dot-dot, remove any trailing directory-separator.
  8. 8.
    If the path is empty, add a dot.
The result of normalization is a path in normal form, which is said to be normalized.