[squeak-dev] The Trunk: Files-cmm.68.mcz

commits at source.squeak.org commits at source.squeak.org
Mon Feb 15 22:12:45 UTC 2010


Chris Muller uploaded a new version of Files to project The Trunk:
http://source.squeak.org/trunk/Files-cmm.68.mcz

==================== Summary ====================

Name: Files-cmm.68
Author: cmm
Time: 15 February 2010, 4:12:35.172 pm
UUID: f9b9cd83-3ec3-4f1e-b93e-160b60039ff9
Ancestors: Files-ul.67

Refactored DirectoryEntry.  Highlights:

- Moved DirectoryEntry from a subclass of ArrayedCollection to a subclass of Object.
- Each DirectoryEntry now knows its 'directory' (a FileDirectory).  At last, DirectoryEntry's are useful enough to serve as first-class "file reference" objects that have otherwise, thus far, been relegated to platform-specific Strings.
- Behaviors exclusive to DirectoryEntry's representing files have been moved to DirectoryEntryFile.  Behaviors exclusive to DirectoryEntry's representing directory's have been moved into DirectoryEntryDirectory.  The DirectoryEntry>>'dirFlag' variable has been removed.
- Added a terse, platform-independent way of expressing FileDirectory concatenation via the #/ operator:

		myFileDirectory / 'subDir' / 'sub-subDir'



=============== Diff against Files-ul.67 ===============

Item was added:
+ ----- Method: DirectoryEntry>>creationDateAndTime (in category 'access') -----
+ creationDateAndTime
+ 	"The DateAndTime my entry in the file system was created."
+ 	^DateAndTime fromSeconds: creationTime!

Item was added:
+ ----- Method: DirectoryEntryDirectory>>copyHere: (in category 'file operations') -----
+ copyHere: aDirectoryEntryFile
+ 	"Copy aDirectoryFileEntry, which represents a file, to the directory I represent."
+ 	^ self asFileDirectory copyHere: aDirectoryEntryFile!

Item was added:
+ ----- Method: DirectoryEntry>>printOn: (in category 'access') -----
+ printOn: aStream 
+ 	super printOn: aStream.
+ 	aStream
+ 		space ;
+ 		nextPutAll: self name!

Item was added:
+ ----- Method: DirectoryEntryFile>>copyTo: (in category 'file operations') -----
+ copyTo: targetDirectory 
+ 	"Make a copy of me in targetDirectory.  targetDirectory can be a FileDirectory, ServerDirectory or a DirectoryEntryDirectory.  If a file with my name already exists in targetDirectory, signal a FileExistsException."
+ 	^ targetDirectory copyHere: self!

Item was changed:
  ----- Method: FileDirectory>>directoryNames (in category 'enumeration') -----
  directoryNames
  	"Return a collection of names for the subdirectories of this directory."
  	"FileDirectory default directoryNames"
  
+ 	^ (self entries select: [:entry | entry isDirectory ])
+ 		collect: [:entry | entry name]
- 	^ (self entries select: [:entry | entry at: 4])
- 		collect: [:entry | entry first]
  !

Item was added:
+ ----- Method: DirectoryEntry>>modificationDateAndTime (in category 'access') -----
+ modificationDateAndTime
+ 	"The DateAndTime my entry in the file system was last modified."
+ 	^ DateAndTime fromSeconds: modificationTime!

Item was added:
+ ----- Method: DirectoryEntry>>setDirectory: (in category 'private-initialization') -----
+ setDirectory: aFileOrServerDirectory 
+ 	"Set only my (containing) directory.  This is only needed because I couldn't factor ServerDirectory class>>#parseFTPEntry: to the instance-side (because HTTPClient utility uses it).  Therefore, they pass a nil and then set my 'directory' immediately after.."
+ 	directory := aFileOrServerDirectory!

Item was added:
+ ----- Method: FileDirectory>>copyHere: (in category 'file operations') -----
+ copyHere: aDirectoryEntryFile 
+ 	"Copy aDirectoryEntryFile, which represents a file, to the directory I represent."
+ 	aDirectoryEntryFile readStream in: 
+ 		[ : readStream | 
+ 		[ self 
+ 			putFile: readStream
+ 			named: aDirectoryEntryFile name ] ensure: [ readStream close ] ]!

Item was added:
+ ----- Method: DirectoryEntryFile>>contentsFrom:to: (in category 'stream access') -----
+ contentsFrom: startPosition to: endPosition 
+ 	"Answer my contents from startPosition to endPosition."
+ 	^ FileStream 
+ 		detectFile: [ self readStream ]
+ 		do: 
+ 			[ : stream | 
+ 			stream
+ 				position: startPosition ;
+ 				next: endPosition - startPosition + 1 ]!

Item was changed:
  ----- Method: DirectoryEntry>>isDirectory (in category 'access') -----
  isDirectory
  	"whether this entry represents a directory"
+ 	self subclassResponsibility!
- 	^dirFlag!

Item was changed:
  ----- Method: FileDirectory>>fileNames (in category 'enumeration') -----
  fileNames
  	"Return a collection of names for the files (but not directories) in this directory."
  	"FileDirectory default fileNames"
+ 	^ (self entries reject: [ : entry | entry isDirectory ]) 
+ 		collect: [ : entry | entry name ]!
- 
- 	^ (self entries select: [:entry | (entry at: 4) not])
- 		collect: [:entry | entry first]
- !

Item was added:
+ ----- Method: DirectoryEntry class>>fromArray:directory: (in category 'instance creation') -----
+ fromArray: array directory: aFileDirectoryOrServerDirectory 
+ 	| entryType |
+ 	entryType := (array at: 4) 
+ 		ifTrue: [ DirectoryEntryDirectory ]
+ 		ifFalse: [ DirectoryEntryFile ].
+ 	^ entryType 
+ 		directory: aFileDirectoryOrServerDirectory
+ 		name: (array at: 1)
+ 		creationTime: (array at: 2)
+ 		modificationTime: (array at: 3)
+ 		fileSize: (array at: 5)!

Item was added:
+ ----- Method: DirectoryEntryFile>>delete (in category 'file operations') -----
+ delete
+ 	directory deleteFileNamed: self name!

Item was added:
+ ----- Method: DirectoryEntryFile>>readStream (in category 'stream access') -----
+ readStream
+ 	"Answer a FileStream on my contents that can be read, but not written."
+ 	^ directory readOnlyFileNamed: self name!

Item was changed:
+ Object subclass: #DirectoryEntry
+ 	instanceVariableNames: 'directory name creationTime modificationTime fileSize'
- ArrayedCollection subclass: #DirectoryEntry
- 	instanceVariableNames: 'name creationTime modificationTime dirFlag fileSize'
  	classVariableNames: ''
  	poolDictionaries: ''
  	category: 'Files-Directories'!
  
  !DirectoryEntry commentStamp: '<historical>' prior: 0!
  an entry in a directory; a reference to either a file or a directory.!

Item was added:
+ ----- Method: Integer>>asBytesDescription (in category '*files') -----
+ asBytesDescription
+ 	"Answer a terse, easily-readable representation of this Integer reprsenting a number of bytes.  Useful for file-browsers."
+ 	| suffixes |
+ 	suffixes := { 'k'"ilobytes". 'M'"egabytes". 'G'"igabytes". 'T'"erabytes". 'P'"etabytes". 'E'"xabytes". 'Z'"ettabytes". 'Y'"ottabytes"}.
+ 	suffixes size to: 1 by: -1 do:
+ 		[ : index |  | units |
+ 		units := 1000 raisedTo: index.
+ 		self > units ifTrue: [ ^ ((self / units) asFloat roundTo: 0.01) asString, (suffixes at: index) ] ].
+ 	^ self asString!

Item was added:
+ DirectoryEntry subclass: #DirectoryEntryFile
+ 	instanceVariableNames: ''
+ 	classVariableNames: ''
+ 	poolDictionaries: ''
+ 	category: 'Files-Directories'!

Item was added:
+ ----- Method: DirectoryEntry>>containingDirectory (in category 'access') -----
+ containingDirectory
+ 	"Answer the FileDirectory in which I reside."
+ 	^ directory!

Item was added:
+ ----- Method: DirectoryEntry>>copyTo: (in category 'file operations') -----
+ copyTo: fileOrServerDirectory 
+ 	"Copy me to fileOrServerDirectory."
+ 	self subclassResponsibility!

Item was added:
+ ----- Method: DirectoryEntry>>services (in category 'services') -----
+ services
+ 	"Answer the same collection of SimpleServiceEntry's accessed by the FileList."
+ 	^ FileList itemsForFile: self fullName!

Item was changed:
  ----- Method: FileDirectory>>directoryContentsFor: (in category 'private') -----
  directoryContentsFor: fullPath
  	"Return a collection of directory entries for the files and directories in the directory with the given path. See primLookupEntryIn:index: for further details."
  	"FileDirectory default directoryContentsFor: ''"
  
  	| entries index done entryArray f |
  	entries := OrderedCollection new: 200.
  	index := 1.
  	done := false.
  	f := fullPath asVmPathName.
  	[done] whileFalse: [
  		entryArray := self primLookupEntryIn: f index: index.
  		#badDirectoryPath = entryArray ifTrue: [
  			^(InvalidDirectoryError pathName: pathName asSqueakPathName) signal].
  		entryArray == nil
  			ifTrue: [done := true]
+ 			ifFalse: [entries addLast: (DirectoryEntry fromArray: entryArray directory: self)].
- 			ifFalse: [entries addLast: (DirectoryEntry fromArray: entryArray)].
  		index := index + 1].
  
  	^ entries asArray collect: [:s | s convertFromSystemName].
  !

Item was added:
+ ----- Method: DirectoryEntryFile>>isDirectory (in category 'testing') -----
+ isDirectory
+ 	"whether this entry represents a directory, it does not."
+ 	^ false!

Item was added:
+ ----- Method: DirectoryEntry>>fullName (in category 'access') -----
+ fullName
+ 	"The fully-qualified name."
+ 	^ directory fullNameFor: self name!

Item was added:
+ ----- Method: DirectoryEntry class>>directory:name:creationTime:modificationTime:fileSize: (in category 'instance creation') -----
+ directory: aFileDirectoryOrServerDirectory name: name0 creationTime: creationTime modificationTime: modificationTime fileSize: fileSize 
+ 	^ self new 
+ 		setDirectory: aFileDirectoryOrServerDirectory
+ 		name: name0
+ 		creationTime: creationTime
+ 		modificationTime: modificationTime
+ 		fileSize: fileSize!

Item was added:
+ ----- Method: DirectoryEntry>>fileSizeString (in category 'access') -----
+ fileSizeString
+ 	"Answer my file size as an easy-to-read String."
+ 	^ self fileSize asBytesDescription!

Item was added:
+ ----- Method: DirectoryEntryDirectory>>asFileDirectory (in category 'convert') -----
+ asFileDirectory
+ 	"Answer a FileDirectory representing the same directory I represent."
+ 	^ self containingDirectory in: [ : cd | cd on: (cd fullNameFor: self name) ]!

Item was added:
+ ----- Method: DirectoryEntry>>delete (in category 'file operations') -----
+ delete
+ 	"Physically remove from the disk."
+ 	self subclassResponsibility!

Item was changed:
  ----- Method: FileDirectory>>entries (in category 'enumeration') -----
  entries
+ 	"Return a collection of DirectoryEntry's for the files and directories in this directory.  See primLookupEntryIn:index: for further details."
- 	"Return a collection of directory entries for the files and directories in this directory. Each entry is a five-element array: (<name><creationTime><modificationTime><dirFlag><fileSize>). See primLookupEntryIn:index: for further details."
  	"FileDirectory default entries"
- 
  	^ self directoryContentsFor: pathName
  !

Item was changed:
+ ----- Method: DirectoryEntry class>>name:creationTime:modificationTime:isDirectory:fileSize: (in category 'deprecated') -----
- ----- Method: DirectoryEntry class>>name:creationTime:modificationTime:isDirectory:fileSize: (in category 'instance creation') -----
  name: name0  creationTime: creationTime  modificationTime: modificationTime   isDirectory: isDirectory  fileSize: fileSize
+ 	"This is the legacy creation method we are trying to phase out.  Please use #directory:  name:  creationTime:  modificationTime:  fileSize:." 
+ 	| type |
+ 	type := isDirectory 
+ 		ifTrue: [ DirectoryEntryDirectory ]
+ 		ifFalse: [ DirectoryEntryFile ].
+ 	^ type
+ 		directory: nil
+ 		name: name0  
+ 		creationTime: creationTime  
+ 		modificationTime: modificationTime   
+ 		fileSize: fileSize!
- 	^self new privateName: name0  creationTime: creationTime  modificationTime: modificationTime  isDirectory: isDirectory  fileSize: fileSize!

Item was added:
+ ----- Method: DirectoryEntry>>setDirectory:name:creationTime:modificationTime:fileSize: (in category 'private-initialization') -----
+ setDirectory: aFileDirectoryOrServerDirectory name: name0  creationTime: creationTime0  modificationTime: modificationTime0 fileSize: fileSize0
+ 	directory := aFileDirectoryOrServerDirectory.
+ 	name := name0.
+ 	creationTime := creationTime0.
+ 	modificationTime := modificationTime0.
+ 	fileSize := fileSize0!

Item was changed:
+ ----- Method: DirectoryEntry>>at: (in category 'access') -----
- ----- Method: DirectoryEntry>>at: (in category 'access-compatibility') -----
  at: index
  	"compatibility interface"
+ 	self deprecated: 'old-style access to DirectoryEntry'.
- 	"self halt: 'old-style access to DirectoryEntry'"
  	index = 1 ifTrue: [ ^self name ].
  	index = 2 ifTrue: [ ^self creationTime ].
  	index = 3 ifTrue: [ ^self modificationTime ].
  	index = 4 ifTrue:[ ^self isDirectory ].
  	index = 5 ifTrue:[ ^self fileSize ].
+ 	self error: 'invalid index specified'.
+ !
- 	self error: 'invalid index specified'.!

Item was changed:
  ----- Method: DirectoryEntry>>creationTime (in category 'access') -----
  creationTime
+ 	"The time the entry was created, as an Integer number of seconds offset from the DateAndTime epoch."
- 	"time the entry was created.  (what's its type?)"
  	^creationTime!

Item was changed:
  ----- Method: FileDirectory>>fileAndDirectoryNames (in category 'enumeration') -----
  fileAndDirectoryNames
  	"FileDirectory default fileAndDirectoryNames"
+ 	^ self entries collect: [ : entry | entry name ]!
- 
- 	^ self entries collect: [:entry | entry first]
- !

Item was added:
+ ----- Method: DirectoryEntryFile>>readWriteStream (in category 'stream access') -----
+ readWriteStream
+ 	"Answer a FileStream on my contents that can be read and written."
+ 	^ directory fileNamed: self name!

Item was changed:
  ----- Method: AcornFileDirectory>>directoryContentsFor: (in category 'private') -----
  directoryContentsFor: fullPath 
  	"Return a collection of directory entries for the files and directories in 
  	the directory with the given path. See primLookupEntryIn:index: for 
  	further details."
  	"FileDirectory default directoryContentsFor: ''"
  
  	| entries extraPath |
  	entries := super directoryContentsFor: fullPath.
  	fullPath isNullPath
  		ifTrue: [
  			"For Acorn we also make sure that at least the parent of the current dir 
  			is added - sometimes this is in a filing system that has not been (or 
  			cannot be) polled for disc root names"
  			extraPath := self class default containingDirectory.
  			"Only add the extra path if we haven't already got the root of the current dir in the list"
  			entries detect: [:ent | extraPath fullName beginsWith: ent name] 
  				ifNone: [entries := entries
+ 								copyWith: (DirectoryEntryDirectory
+ 										directory: self
- 								copyWith: (DirectoryEntry
  										name: extraPath fullName
  										creationTime: 0
  										modificationTime: 0
- 										isDirectory: true
  										fileSize: 0)]].
  	^ entries
  !

Item was added:
+ DirectoryEntry subclass: #DirectoryEntryDirectory
+ 	instanceVariableNames: ''
+ 	classVariableNames: ''
+ 	poolDictionaries: ''
+ 	category: 'Files-Directories'!
+ 
+ !DirectoryEntryDirectory commentStamp: 'cmm 9/13/2007 12:24' prior: 0!
+ an entry in a directory; a reference to a directory.!

Item was added:
+ ----- Method: DirectoryEntryFile>>contentsTo: (in category 'stream access') -----
+ contentsTo: endPosition 
+ 	"Answer my contents up to endPosition."
+ 	^ self 
+ 		contentsFrom: 0
+ 		to: endPosition!

Item was added:
+ ----- Method: FileDirectory>>/ (in category 'path access') -----
+ / aString 
+ 	"Answer a FileDirectory on a subdirectory named aString, of the receiver."
+ 	^ FileDirectory on: (self fullNameFor: aString)!

Item was added:
+ ----- Method: DirectoryEntryDirectory>>isDirectory (in category 'testing') -----
+ isDirectory
+ 	"whether this entry represents a directory, it does."
+ 	^ true!

Item was changed:
  ----- Method: FileDirectory>>entryAt:ifAbsent: (in category 'file status') -----
  entryAt: fileName ifAbsent: aBlock
  	"Find the entry with local name fileName and answer it.
  	If not found, answer the result of evaluating aBlock."
- 
  	| comparisonBlock |
  	self isCaseSensitive
+ 		ifTrue: [comparisonBlock := [:entry | entry name = fileName]]
+ 		ifFalse: [comparisonBlock := [:entry | entry name sameAs: fileName]].
- 		ifTrue: [comparisonBlock := [:entry | (entry at: 1) = fileName]]
- 		ifFalse: [comparisonBlock := [:entry | (entry at: 1) sameAs: fileName]].
  	^ self entries detect: comparisonBlock ifNone: [aBlock value]!

Item was removed:
- ----- Method: DirectoryEntry>>privateName:creationTime:modificationTime:isDirectory:fileSize: (in category 'private-initialization') -----
- privateName: name0  creationTime: creationTime0  modificationTime: modificationTime0  isDirectory: isDirectory0  fileSize: fileSize0
- 	name := name0.
- 	creationTime := creationTime0.
- 	modificationTime := modificationTime0.
- 	dirFlag := isDirectory0.
- 	fileSize := fileSize0.!

Item was removed:
- ----- Method: DirectoryEntry class>>fromArray: (in category 'instance creation') -----
- fromArray: array
- 	^self name: (array at: 1) creationTime: (array at: 2) modificationTime: (array at: 3) isDirectory: (array at: 4) fileSize: (array at: 5) !

Item was removed:
- ----- Method: DirectoryEntry>>size (in category 'access-compatibility') -----
- size
- 	^5!




More information about the Squeak-dev mailing list