Windows FileSystem '\test\bar' not an absolute path

Previous Topic Next Topic
 
classic Classic list List threaded Threaded
3 messages Options
Reply | Threaded
Open this post in threaded view
|

Windows FileSystem '\test\bar' not an absolute path

Ben Coman

I have some strong concerns about the semantics of FileSystem on MS
Windows treating '\directory' as a relative path rather than an absolute
path.

For example currently...
    '/tmp/test.txt' asFileReference fullName
    --> 'C:\Users\Ben\AppData\Roaming\Pharo\images\30790\tmp\test.txt'

when it _should_ go...
    '/tmp/test.txt' asFileReference fullName
    -->  'C:\tmp\x.txt'

This seems to be by design per '\test\bar' below...

WindowsStoreTest>>testAbsolutePath
    #('c:\' 'C:\temp' 'A:\temp\test') do: [:each |
        self assert: (WindowsStore current pathFromString: each)
isAbsolute ]
   
WindowsStoreTest>>testRelativePath
    #('a' 'bin\foo' 'temp\test' '\test\bar') do: [:each |
        self assert: (WindowsStore current pathFromString: each)
isRelative ]
   

However taking as reference the Windows Command Shell (cmd.exe)...
(1) C:\> mkdir \a\b\a\c
(2) C:\> cd a
(3) C:\a> cd b
(4) C:\a\b> cd \a
(5) C:\a>

observe that after 'cd \a' (4) the working directory becomes absolute
'C:\a' rather than relative 'C:\a\b\a' .

Microsoft defines [1] a file name is RELATIVE to the current directory
if it DOES NOT begin with:
* A single backslash, for example, "\directory" or "\file.txt". This is
also referred to as an ABSOLUTE path.

Indeed all Windows applications I know operate this way. Using different
semantics is a bug.

[1]
http://msdn.microsoft.com/en-us/library/aa365247.aspx#fully_qualified_vs._relative_paths

What are your thoughts?
cheers -ben

Reply | Threaded
Open this post in threaded view
|

Re: Windows FileSystem '\test\bar' not an absolute path

Ben Coman
Ben Coman wrote:

>
> I have some strong concerns about the semantics of FileSystem on MS
> Windows treating '\directory' as a relative path rather than an
> absolute path.
>
> For example currently...
>    '/tmp/test.txt' asFileReference fullName    -->
> 'C:\Users\Ben\AppData\Roaming\Pharo\images\30790\tmp\test.txt'
>
> when it _should_ go...
>    '/tmp/test.txt' asFileReference fullName    -->  'C:\tmp\x.txt'
>
> This seems to be by design per '\test\bar' below...
>
> WindowsStoreTest>>testAbsolutePath
>    #('c:\' 'C:\temp' 'A:\temp\test') do: [:each |
>        self assert: (WindowsStore current pathFromString: each)
> isAbsolute ]
>   WindowsStoreTest>>testRelativePath
>    #('a' 'bin\foo' 'temp\test' '\test\bar') do: [:each |
>        self assert: (WindowsStore current pathFromString: each)
> isRelative ]
>  
> However taking as reference the Windows Command Shell (cmd.exe)...
> (1) C:\> mkdir \a\b\a\c
> (2) C:\> cd a
> (3) C:\a> cd b
> (4) C:\a\b> cd \a
> (5) C:\a>
>
> observe that after 'cd \a' (4) the working directory becomes absolute
> 'C:\a' rather than relative 'C:\a\b\a' .
>
> Microsoft defines [1] a file name is RELATIVE to the current directory
> if it DOES NOT begin with:
> * A single backslash, for example, "\directory" or "\file.txt". This
> is also referred to as an ABSOLUTE path.
>
> Indeed all Windows applications I know operate this way. Using
> different semantics is a bug.
>
> [1]
> http://msdn.microsoft.com/en-us/library/aa365247.aspx#fully_qualified_vs._relative_paths 
>
>
> What are your thoughts?
> cheers -ben
>
>
I propose something like the following changes...

WindowsStoreTest>>testAbsolutePath
    #('c:\' 'C:\temp' 'A:\temp\test' '\test\bar') do: [:each |  
"<--MODIFIED"
        self assert: (WindowsStore current pathFromString: each)
isAbsolute ]
   
WindowsStoreTest>>testRelativePath
    #('a' 'bin\foo' 'temp\test' 'C:temp\test' ) do: [:each |    
"<--MODIFIED"
        self assert: (WindowsStore current pathFromString: each)
isRelative ]

Path>>absoluteWindowsPathRegex
    ^ (absoluteWindowsPathRegex ifNil: [
        absoluteWindowsPathRegex := '([a-zA-Z]\:)?\\.*' asRegex ])
copy      "<--MODIFIED"  
    "    absoluteWindowsPathRegex := '[a-zA-Z]\:\\.*'    asRegex ])
copy"     "<--PREVIOUS"
   
Path>>first   "<--ADDED"
    ^ self at: 1.
   
WindowsStore>>printPath: aPath on: aStream
    (aPath first includes: $:) ifFalse: [ aStream nextPutAll: self
currentDisk ; nextPut: self delimiter ]. "<--ADDED"
    aPath printOn: aStream delimiter: self delimiter
   
WindowsStore>>currentDisk  "<--ADDED"
    "Assumes workingDirectory is always an absolute path"
    ^ disk ifNil: [  disk = FileSystem workingDirectory path first ]
   

after which...
    '/tmp/test.txt' asFileReference fullName
    --> 'C:\tmp\test.txt'

This needs some polish.  I haven't looked for adverse effects yet.  
However Pathtest, FileReferenceTest, FileSystemTest & WindowsStoreTest
are all green.

What do your think?
cheers -ben  


Reply | Threaded
Open this post in threaded view
|

Re: Windows FileSystem '\test\bar' not an absolute path

Ben Coman
[hidden email] wrote:

> Ben Coman wrote:
>>
>> I have some strong concerns about the semantics of FileSystem on MS
>> Windows treating '\directory' as a relative path rather than an
>> absolute path.
>>
>> For example currently...
>>    '/tmp/test.txt' asFileReference fullName    -->
>> 'C:\Users\Ben\AppData\Roaming\Pharo\images\30790\tmp\test.txt'
>>
>> when it _should_ go...
>>    '/tmp/test.txt' asFileReference fullName    -->  'C:\tmp\x.txt'
>>
>> This seems to be by design per '\test\bar' below...
>>
>> WindowsStoreTest>>testAbsolutePath
>>    #('c:\' 'C:\temp' 'A:\temp\test') do: [:each |
>>        self assert: (WindowsStore current pathFromString: each)
>> isAbsolute ]
>>   WindowsStoreTest>>testRelativePath
>>    #('a' 'bin\foo' 'temp\test' '\test\bar') do: [:each |
>>        self assert: (WindowsStore current pathFromString: each)
>> isRelative ]
>>  
>> However taking as reference the Windows Command Shell (cmd.exe)...
>> (1) C:\> mkdir \a\b\a\c
>> (2) C:\> cd a
>> (3) C:\a> cd b
>> (4) C:\a\b> cd \a
>> (5) C:\a>
>>
>> observe that after 'cd \a' (4) the working directory becomes absolute
>> 'C:\a' rather than relative 'C:\a\b\a' .
>>
>> Microsoft defines [1] a file name is RELATIVE to the current
>> directory if it DOES NOT begin with:
>> * A single backslash, for example, "\directory" or "\file.txt". This
>> is also referred to as an ABSOLUTE path.
>>
>> Indeed all Windows applications I know operate this way. Using
>> different semantics is a bug.
>>
>> [1]
>> http://msdn.microsoft.com/en-us/library/aa365247.aspx#fully_qualified_vs._relative_paths 
>>
>>
>> What are your thoughts?
>> cheers -ben
>>
>>
> I propose something like the following changes...
>
> WindowsStoreTest>>testAbsolutePath
>    #('c:\' 'C:\temp' 'A:\temp\test' '\test\bar') do: [:each |  
> "<--MODIFIED"
>        self assert: (WindowsStore current pathFromString: each)
> isAbsolute ]
>   WindowsStoreTest>>testRelativePath
>    #('a' 'bin\foo' 'temp\test' 'C:temp\test' ) do: [:each |    
> "<--MODIFIED"
>        self assert: (WindowsStore current pathFromString: each)
> isRelative ]
>
> Path>>absoluteWindowsPathRegex
>    ^ (absoluteWindowsPathRegex ifNil: [
>        absoluteWindowsPathRegex := '([a-zA-Z]\:)?\\.*' asRegex ])
> copy      "<--MODIFIED"      "    absoluteWindowsPathRegex :=
> '[a-zA-Z]\:\\.*'    asRegex ]) copy"     "<--PREVIOUS"
>   Path>>first   "<--ADDED"
>    ^ self at: 1.
>   WindowsStore>>printPath: aPath on: aStream
>    (aPath first includes: $:) ifFalse: [ aStream nextPutAll: self
> currentDisk ; nextPut: self delimiter ]. "<--ADDED"
>    aPath printOn: aStream delimiter: self delimiter
>   WindowsStore>>currentDisk  "<--ADDED"
>    "Assumes workingDirectory is always an absolute path"
>    ^ disk ifNil: [  disk = FileSystem workingDirectory path first ]
>  
> after which...
>    '/tmp/test.txt' asFileReference fullName
>    --> 'C:\tmp\test.txt'
>
> This needs some polish.  I haven't looked for adverse effects yet.  
> However Pathtest, FileReferenceTest, FileSystemTest & WindowsStoreTest
> are all green.
>
> What do your think?
> cheers -ben
>
>
This is an important issue for Windows users.  The fix has had a few
iterations and is ready for wider testing [1].  Assistance to test and
advise if the result is reasonable would be appreciated.

[1]
https://pharo.fogbugz.com/f/cases/13065/Windows-FileSystem-test-bar-not-an-absolute-path 


cheers -ben