DirectoryContents.st
changeset 2079 1e481f917bfb
parent 2078 a196d0ebe6fc
child 2080 20651a2e1c4f
--- a/DirectoryContents.st	Thu Dec 18 17:16:20 2008 +0100
+++ b/DirectoryContents.st	Fri Dec 19 09:47:31 2008 +0100
@@ -12,7 +12,7 @@
 "{ Package: 'stx:libbasic2' }"
 
 Object subclass:#DirectoryContents
-	instanceVariableNames:'directory timeStamp contents isReadable isRootDirectory'
+	instanceVariableNames:'directory timeStamp contents isReadable isRootDirectory accessKey'
 	classVariableNames:'CachedDirectories LockSema ReadersList'
 	poolDictionaries:''
 	category:'System-Support'
@@ -210,33 +210,43 @@
 
 !DirectoryContents class methodsFor:'private'!
 
+accessKeyForDirectory:aDirectoryOrString
+    "computes a fast access key to retrieve the directory in the cache
+    "
+    |key last|
+    
+    aDirectoryOrString isNil ifTrue:[^ nil ].
+
+    aDirectoryOrString isFilename ifTrue:[ key := aDirectoryOrString nameString ]
+                                 ifFalse:[ key := aDirectoryOrString ].
+
+    key size > 1 ifTrue:[
+        last := key last.
+        (last == $/ or:[last == $\]) ifTrue:[
+            ^ key copyWithoutLast:1.
+        ].
+    ].
+    ^ key
+!
+
 directoryAt:aFileOrString
     "checks whether directory already exists and is valid.
      If true the directory is returned otherwise nil
     "
-    |index directory filename nm|
-
-    aFileOrString isNil ifTrue:[^ nil ].
-
-    aFileOrString isFilename ifTrue:[ nm := aFileOrString nameString ]
-                            ifFalse:[ nm := aFileOrString ].
+    |index directory file fastKey|
 
-    "/ fast check before calling asAbsoluteFilename
-    "/ remove last separator from nameString
+    fastKey := self accessKeyForDirectory:aFileOrString.
+    fastKey isNil ifTrue:[^ nil ].  "/ the name is nil
 
-    (nm size > 1 and:[(nm last == $/ or:[nm last == $\])]) ifTrue:[
-        filename := (nm copyWithoutLast:1) asFilename.
-    ] ifFalse:[
-        filename := aFileOrString asFilename.
-    ].
     directory := nil.
 
     LockSema critical:[
         CachedDirectories notNil ifTrue:[
-            index := CachedDirectories findFirst:[:d| d directory = filename ].
+            index := CachedDirectories findFirst:[:d| d accessKey = fastKey ].
+
             index == 0 ifTrue:[
-                filename := filename asAbsoluteFilename.
-                index := CachedDirectories findFirst:[:d| d directory = filename ].
+                file  := aFileOrString asFilename asAbsoluteFilename.
+                index := CachedDirectories findFirst:[:d| d directory = file ].
             ].
 
             index ~~ 0 ifTrue:[
@@ -331,6 +341,10 @@
 
 !DirectoryContents methodsFor:'accessing'!
 
+accessKey
+    ^ accessKey
+!
+
 directory
     "returns the directoy name as Filename
     "
@@ -455,6 +469,7 @@
     directory       := aFilename asFilename.
     isRootDirectory := directory isRootDirectory.
     isReadable      := true.
+    accessKey       := self class accessKeyForDirectory:directory.
 
 "/Transcript showCR:('Readdir: %1' bindWith:(directory pathName)).
 
@@ -706,7 +721,7 @@
 !DirectoryContents class methodsFor:'documentation'!
 
 version
-    ^ '$Header: /cvs/stx/stx/libbasic2/DirectoryContents.st,v 1.47 2008-12-18 16:16:20 ca Exp $'
+    ^ '$Header: /cvs/stx/stx/libbasic2/DirectoryContents.st,v 1.48 2008-12-19 08:47:31 ca Exp $'
 ! !
 
 DirectoryContents initialize!