Synopsis edit
- file normalize name
Documentation edit
Description edit
Returns a normalized filename for name. A normalized filename is an absolute filename that- Contains no . or .. components.
- Contains no consecutive / characters other than the initial two / characters of a filename that begins with exactly two / characters.
- Contains no symbolic links, except that if name refers to a symbolic link, the final component of the normalized filename remains a symbolic link to afford operations on the link itself, such as file delete, file rename, or file copy.
- Is in the "standard" format for the native platform, On Windows this is the case-preserved long form of the filename.
See Also edit
Bugs edit
- 1194458
- fixed in 8.4.11
Forward Compatibility edit
- file forward compatibility
- file normalize emulation code taken from critcl.tcl, and added to the wiki in the hope that more people will use normalize, and move faster to 8.4 and later.
Volume-Relative filenames edit
Windows has the concept of a current directory per drive, a concept it inherited from DOS. From a Command Prompt you can do:c: cd \winnt d: type c:setup.logand see setup.log from the current directory \winnt on drive c:. It's an obscure featrue, and it doesn't work in Windows Explorer.Therefore, if the current working directory is c:\winnt,
file normalize c:setup.logresults in
C:/WINDOWS/WindowsUpdate.logPrior to Tcl version 8.4.5, file normalize didn't handle volume relative filenames correctly:
file normalize c:a/bresulted in c:a/b
File normalize and Windows folder junctions edit
2013-01-08: All Tcl versions before 8.5.13, 8.6.0 have bugs with folder junctions, when the access rights are restricted tcl-Bugs-3092089


Example
Create a folder, C:\test2, and a junction, C:\test2_junction to it.In a dos box with administrator rights:C:\Windows\system32> cd c:\ C:\> mkdir test2 C:\> mklink /j test2_junction test2Now test file normalize in a wish console:
% file normalize c:/test2_junction c:/test2_junction % file normalize c:/test2_junction/test.txt c:/test2/test.txt
Resolving symlinks in the last component of a path edit
To resolve symlinks in a path's final component (i.e., the target file or directory name itself) you can use the following trick: add /something to the path before normalizing it then strip the extra component away with file dirname.For example,set resolvedArgv0 [file dirname [file normalize $argv0/___]]]dbohdan 2015-05-12: This trick was implemented by AK in Tclssg's main procedure

Alternative that leaves symlinks alone edit
[mfriedrich] How to normalize a path without resolving symlinks? E.g. on Windows mapped network drives where the server uses NTFS junctions pointing to server disks and not to local disks.AMG: Try repeated [regsub]. Here's code from Wibble, sans call to the Wibble-specific [dehex] command:regsub -all {(?:/|^)\.(?=/|$)} $path / path while {[regsub {(?:/[^/]*/+|^[^/]*/+|^)\.\.(?=/|$)} $path "" path]} {} regsub -all {//+} /$path / path
MHo 2016-02-12: Just realized that file normalize does not work as expected in the following special case:
% glob //?/UNC//wk101w0045/d$ -- * base-tcl-thread-win32-ix86.dll base-tcl-thread-win32-ix86.exe base-tcl8.6-thread-win32-ix86.dll base-tcl8.6-thread-win32..... % file normalize //?/UNC//wk101w0045/d$ D://?/UNC//wk101w0045/d$ %In that case, a Driveletter is prepended, although it should'nt. //?/ is a valid prefix, as is //?//UNC. These are rarely used special cases, though. More important, the //?//... does NOT WORK AT ALL, if the given spec is a DFS-Link....