--- 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!