file normalize normalizes a filename.
Returns a normalized filename for name. A normalized filename is an absolute filename that
Because file normalize transforms embedded symbolic links, it may be overkill for the purpose of just transforming a filename into an absolute filename. Instead, use file join, perhaps with pwd.
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.log
and 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.log
results in
C:/WINDOWS/WindowsUpdate.log
Prior to Tcl version 8.4.5, file normalize didn't handle volume relative filenames correctly:
file normalize c:a/b
resulted in c:a/b
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 , tcl-Bugs-3587096 . They are fixed in Tcl fossil Check-in 8a291bcb44 .
HaO: file normalize will resolve junctions of the Windows NTFS file system and return the filenames without the junctions, if there is a component after the junction. This is specially helpful, if the junction has less access rights than the direct way (which is the case for localized "program files" folders of Windows Vista). I took the habit, to pass any files in system folders by file normalize before accessing them.
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 test2
Now 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