[squeak-dev] UnixFileDirectory default directoryExists:
UnixFileDirectory default asString, '/.'
Eliot Miranda
eliot.miranda at gmail.com
Fri Dec 16 17:58:52 UTC 2011
On Thu, Dec 15, 2011 at 6:18 PM, David T. Lewis <lewis at mail.msen.com> wrote:
> On Thu, Dec 15, 2011 at 02:19:04PM -0800, Eliot Miranda wrote:
> > Hi All,
> >
> > just noticed that
> >
> > UnixFileDirectory default directoryExists:
> UnixFileDirectory default asString, '/.'
> >
> > answers false, since directoryNames excludes '.' and '..' (justifiable,
> and
> > changing this might break all manner of things). i.e.
> >
> > FileDirectory>directoryExists: filenameOrPath
> > "Answer true if a directory of the given name exists. The given name may
> be
> > either a full path name or a local directory within this directory."
> > "FileDirectory default directoryExists: FileDirectory default pathName"
> >
> > | fName dir |
> > DirectoryClass splitName: filenameOrPath to:
> > [:filePath :name |
> > fName := name.
> > filePath isEmpty
> > ifTrue: [dir := self]
> > ifFalse: [dir := self directoryNamed: filePath]].
> >
> > ^dir exists and: [
> > self isCaseSensitive
> > ifTrue:[dir directoryNames includes: fName]
> > ifFalse:[dir directoryNames anySatisfy: [:name| name sameAs: fName]]].
> >
> >
> > So how about
> >
> > FileDirectory class methods for accessing
> > currentDirectoryNickname
> > ^'.'
> >
> > FileDirectory>directoryExists: filenameOrPath
> > "Answer true if a directory of the given name exists. The given name may
> be
> > either a full path name or a local directory within this directory."
> > "FileDirectory default directoryExists: FileDirectory default pathName"
> >
> > | fName dir |
> > DirectoryClass splitName: filenameOrPath to:
> > [:filePath :name |
> > fName := name.
> > filePath isEmpty
> > ifTrue: [dir := self]
> > ifFalse: [dir := self directoryNamed: filePath]].
> >
> > ^dir exists
> > and: [fName = self class currentDirectoryNickname
> > or: [self isCaseSensitive
> > ifTrue:[dir directoryNames includes: fName]
> > ifFalse:[dir directoryNames anySatisfy: [:name| name sameAs: fName]]]]
>
>
> Then how would we handle this:
>
> UnixFileDirectory default directoryExists: UnixFileDirectory default
> fullName, '/../../.'
>
It works fine. splitPath:... splits it to e.g.
'/Users/eliot/Squeak/Squeak4.2/../..' and '.' and so the result its true.
Note that /.. = / on Unix, so one can't have too many '..' or '.'
components. The issue is what is the last component, and if that is '.'
or '..' then the code I supplied works.
>
> Or this:
>
> UnixFileDirectory default directoryExists: '/usr/b?n'
>
That works if there is a file called b?n. Using ? as a wild-card is a
shell facility, nothing to do with the file system. So this is a
non-sequitur.
>
> There is a reasonable approximation of unix path handling in the
> CommandShell package (see class ShellSyntax), but IMO this is too
> complex and platform-specific for general use. Furthermore, the method
> comment for #directoryExists: says that the path should specify either
> a full path name or a local directory within the directory, and '/.'
> does not meet these criteria. So in my opinion, the current behavior
> is unexpected for a unix user but it is not incorrect, and changing it
> to work correctly in a unix-like way is not worth the added complexity.
>
But you're forcing user code to handle the unexpected, and that's really
bad. Peppering code with Smalltalk platformName = 'unix' or: [Smalltalk
platformName = 'Mac OS'] is an awful approach. The file system classes
should be robust, and the issue above affects Windows as well as unix.
Given that the new code handles your objections rationally I respectfully
disagree, It *is* worth the minimal added complexity.
>
> Dave
>
>
>
--
best,
Eliot
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.squeakfoundation.org/pipermail/squeak-dev/attachments/20111216/24955b04/attachment.htm
More information about the Squeak-dev
mailing list
|