Object subclass: #FileManipulator instanceVariableNames: 'fileTracker lineEndCode lineEndChar isWithLineEndChar destFile destDir pathname ' classVariableNames: '' poolDictionaries: '' category: 'Ume-File-Util'! FileManipulator comment: 'Copyright(C) 1998 Masashi Umezawa All Rights Reserved. version: EA '! !FileManipulator methodsFor: 'initialize-release'! initialize "Copyright(C) 1998 Masashi Umezawa All Rights Reserved. version: EA" fileTracker := FileTracker new. pathname := '.'. destDir := '.'. destFile := 'temp.txt'. isWithLineEndChar := false. self initLineEndChar! initLineEndChar "Copyright(C) 1998 Masashi Umezawa All Rights Reserved. version: EA" lineEndCode := IOAccessor defaultLineEndConvention. (lineEndCode = 1 or: [lineEndCode = 3]) ifTrue: [lineEndChar := Character cr]. lineEndCode = 2 ifTrue: [lineEndChar := Character lf]! ! !FileManipulator methodsFor: 'content deleting'! delete: deleteString "Copyright(C) 1998 Masashi Umezawa All Rights Reserved. version: EA" self replace: deleteString with: ''! deleteAllBetween: startMark and: endMark "Copyright(C) 1998 Masashi Umezawa All Rights Reserved. version: EA" self processFileContent: [:cont | ''] between: startMark and: endMark! deleteBetween: startMark and: endMark "Copyright(C) 1998 Masashi Umezawa All Rights Reserved. version: EA" self processFileContent: [:cont | startMark , endMark] between: startMark and: endMark! deleteLineIncluding: deleteString "Copyright(C) 1998 Masashi Umezawa All Rights Reserved. version: EA" self processFileLine: [:line | | found | found := (line indexOfSubCollection: deleteString startingAt: 1) > 0. found ifTrue: [''] ifFalse: [line]]! deleteLineIncludingAllCollection: deleteStringCollection "Copyright(C) 1998 Masashi Umezawa All Rights Reserved. version: EA" self processFileLine: [:line | | found | found := self findString: line including: deleteStringCollection all: true. found ifTrue: [''] ifFalse: [line]]! deleteLineIncludingCollection: deleteStringCollection "Copyright(C) 1998 Masashi Umezawa All Rights Reserved. version: EA" self processFileLine: [:line | | found | found := self findString: line including: deleteStringCollection all: false. found ifTrue: [''] ifFalse: [line]]! deleteLinesFrom: startLineNumber to: endLineNumber "Copyright(C) 1998 Masashi Umezawa All Rights Reserved. version: EA" | count | count := 0. self processFileLine: [:line | count := count + 1. (count between: startLineNumber and: endLineNumber) ifTrue: [''] ifFalse: [line]]! ! !FileManipulator methodsFor: 'content adding'! addFooter: addString "Copyright(C) 1998 Masashi Umezawa All Rights Reserved. version: EA" | doBlock | doBlock := [:filename | | wStr | wStr := filename appendStream. self write: addString To: wStr. wStr close]. self startFileTracker: doBlock! addHeader: addString "Copyright(C) 1998 Masashi Umezawa All Rights Reserved. version: EA" | doBlock | doBlock := [:filename | | rStr cont wStr | rStr := filename readStream. cont := rStr contents. rStr close. wStr := filename newReadWriteStream. self writeHeader: addString To: wStr. wStr nextPutAll: cont. wStr close]. self startFileTracker: doBlock! addHeader: headerString footer: footerString between: startMark and: endMark "Copyright(C) 1998 Masashi Umezawa All Rights Reserved. version: EA" self processFileContent: [:cont | | newStr | newStr := String new: 1024. self write: headerString To: newStr. newStr nextPutAll: cont. self write: footerString To: newStr. newStr contents] between: startMark and: endMark! addInnerHeader: headerString footer: footerString between: startMark and: endMark "Copyright(C) 1998 Masashi Umezawa All Rights Reserved. version: EA" self processFileContent: [:cont | | newStr | newStr := String new: 1024. newStr nextPutAll: startMark. self write: headerString To: newStr. newStr nextPutAll: (self chopMarks: startMark and: endMark in: cont). self write: footerString To: newStr. newStr nextPutAll: endMark. newStr contents] between: startMark and: endMark! ! !FileManipulator methodsFor: 'content replacing'! replace: fromString with: toString "Copyright(C) 1998 Masashi Umezawa All Rights Reserved. version: EA" self processFileContent: [:cont | cont copyReplaceAll: fromString with: toString]! replace: fromString with: toString between: startMark and: endMark "Copyright(C) 1998 Masashi Umezawa All Rights Reserved. version: EA" self processFileContent: [:cont | cont copyReplaceAll: fromString with: toString] between: startMark and: endMark! replaceUsing: fromToDictionary "Copyright(C) 1998 Masashi Umezawa All Rights Reserved. version: EA" self processFileContent: [:cont | self replaceString: cont usingDic: fromToDictionary]! replaceUsing: fromToDictionary between: startMark and: endMark "Copyright(C) 1998 Masashi Umezawa All Rights Reserved. version: EA" self processFileContent: [:cont | self replaceString: cont usingDic: fromToDictionary] between: startMark and: endMark! ! !FileManipulator methodsFor: 'content concatinating'! cat "Copyright(C) 1998 Masashi Umezawa All Rights Reserved. version: EA" self catTo: (self destDir asFilename construct: self destFile) asString insertHeader: '' footer: ''! catInsertHeader: headerString footer: footerString "Copyright(C) 1998 Masashi Umezawa All Rights Reserved. version: EA" self catTo: (self destDir asFilename construct: self destFile) asString insertHeader: headerString footer: footerString! catInsertHeaderBlock: headerStringMakeBlock footerBlock: footerStringMakeBlock "Copyright(C) 1998 Masashi Umezawa All Rights Reserved. version: EA" ^self catTo: (self destDir asFilename construct: self destFile) asString insertHeaderBlock: headerStringMakeBlock footerBlock: footerStringMakeBlock! catInsertHeaderBlock: headerStringMakeBlock footerBlock: footerStringMakeBlock dirBlock: dirStringMakeBlock "Copyright(C) 1998 Masashi Umezawa All Rights Reserved. version: EA" ^self catTo: (self destDir asFilename construct: self destFile) asString insertHeaderBlock: headerStringMakeBlock footerBlock: footerStringMakeBlock dirBlock: dirStringMakeBlock! catTo: newFile "Copyright(C) 1998 Masashi Umezawa All Rights Reserved. version: EA" self catTo: newFile insertHeader: '' footer: ''! catTo: newFile insertHeader: headerString footer: footerString "Copyright(C) 1998 Masashi Umezawa All Rights Reserved. version: EA" self catTo: newFile insertHeaderBlock: [:filenameString | headerString] footerBlock: [:filenameString | footerString]! catTo: newFile insertHeaderBlock: headerStringMakeBlock footerBlock: footerStringMakeBlock "Copyright(C) 1998 Masashi Umezawa All Rights Reserved. version: EA" self catTo: newFile insertHeaderBlock: headerStringMakeBlock footerBlock: footerStringMakeBlock dirBlock: [:filenameOfDir | '']! catTo: newFile insertHeaderBlock: headerStringMakeBlock footerBlock: footerStringMakeBlock dirBlock: dirStringMakeBlock "Copyright(C) 1998 Masashi Umezawa All Rights Reserved. version: EA" | newFilename wStr | newFilename := newFile asFilename. newFilename exists ifTrue: [| result | result := Dialog confirm: 'overwrite ' , newFilename asString , '?'. result ifFalse: [^self]]. wStr := newFilename writeStream. self fileTracker directoryActionBlock: [:filenameOfDir | | dirString | dirString := dirStringMakeBlock value: filenameOfDir asString. self write: dirString To: wStr]. self startFileTracker: [:filename | | rStr headerString footerString | headerString := headerStringMakeBlock value: filename asString. self writeHeader: headerString To: wStr. rStr := filename readStream. [rStr atEnd] whileFalse: [wStr nextPut: rStr next]. footerString := footerStringMakeBlock value: filename asString. self write: footerString To: wStr. rStr close]. wStr close! ! !FileManipulator methodsFor: 'content lineEndChanging'! lineEndFrom: fromLineEndSymbol To: toLineEndSymbol "Copyright(C) 1998 Masashi Umezawa All Rights Reserved. version: EA" self startFileTracker: [:filename | | rStr tmpStream wStr | rStr := filename readStream. self lineEndOf: rStr To: fromLineEndSymbol. tmpStream := (String new: 1024) newReadWriteStream. [rStr atEnd] whileFalse: [tmpStream nextPut: rStr next]. rStr close. tmpStream reset. wStr := filename newReadWriteStream. self lineEndOf: wStr To: toLineEndSymbol. [tmpStream atEnd] whileFalse: [wStr nextPut: tmpStream next]. wStr close]! lineEndTo: toLineEndSymbol "Copyright(C) 1998 Masashi Umezawa All Rights Reserved. version: EA" | lCode fromLineEndSymbol | lCode := self lineEndCode. lCode == 1 ifTrue: [fromLineEndSymbol := #CRLF]. lCode == 2 ifTrue: [fromLineEndSymbol := #LF]. lCode == 3 ifTrue: [fromLineEndSymbol := #CR]. self lineEndFrom: fromLineEndSymbol To: toLineEndSymbol! ! !FileManipulator methodsFor: 'content encoding'! encodeFrom: fromEncodeSymbol To: toEncodeSymbol "Copyright(C) 1998 Masashi Umezawa All Rights Reserved. version: EA" self startFileTracker: [:filename | | rStr tmpStream wStr | rStr := (filename withEncoding: fromEncodeSymbol) readStream. tmpStream := (String new: 1024) newReadWriteStream. [rStr atEnd] whileFalse: [tmpStream nextPut: rStr next]. rStr close. tmpStream reset. wStr := (filename withEncoding: toEncodeSymbol) newReadWriteStream. [tmpStream atEnd] whileFalse: [wStr nextPut: tmpStream next]. wStr close]! encodeTo: toEncodeSymbol "Copyright(C) 1998 Masashi Umezawa All Rights Reserved. version: EA" self encodeFrom: Locale current defaultEncoding To: toEncodeSymbol! ! !FileManipulator methodsFor: 'file copying'! copy "Copyright(C) 1998 Masashi Umezawa All Rights Reserved. version: EA" self copyTo: self destDir! copyTo: aPathname "Copyright(C) 1998 Masashi Umezawa All Rights Reserved. version: EA" | doBlock dm destTop | dm := DirectoryMaker on: aPathname. dm make. destTop := aPathname asFilename. doBlock := [:filename | | dest | dest := destTop constructString: filename head asString. (dm pathnameString: dest) make. filename copyTo: (dest asFilename construct: filename tail)]. self startFileTracker: doBlock! ! !FileManipulator methodsFor: 'file moving'! move "Copyright(C) 1998 Masashi Umezawa All Rights Reserved. version: EA" self moveTo: self destDir! moveTo: aPathname "Copyright(C) 1998 Masashi Umezawa All Rights Reserved. version: EA" self copyTo: aPathname. self removeAll! ! !FileManipulator methodsFor: 'file removing'! remove "Copyright(C) 1998 Masashi Umezawa All Rights Reserved. version: EA" | doBlock | doBlock := [:filename | filename delete]. self startFileTracker: doBlock! removeAll "Copyright(C) 1998 Masashi Umezawa All Rights Reserved. version: EA" | removeList | removeList := OrderedCollection new. self fileTracker directoryActionBlock: [:dir | removeList add: dir]. self remove. Filename errorReporter errorSignal handle: [:ex | ex return] do: [removeList reverseDo: [:each | each delete]]! ! !FileManipulator methodsFor: 'accessing'! destDir "Copyright(C) 1998 Masashi Umezawa All Rights Reserved. version: EA" ^destDir! destDir: aFilePathString "Copyright(C) 1998 Masashi Umezawa All Rights Reserved. version: EA" destDir := aFilePathString! destFile "Copyright(C) 1998 Masashi Umezawa All Rights Reserved. version: EA" ^destFile! destFile: aFileNameString "Copyright(C) 1998 Masashi Umezawa All Rights Reserved. version: EA" destFile := aFileNameString! fileTracker "Copyright(C) 1998 Masashi Umezawa All Rights Reserved. version: EA" ^fileTracker! fileTracker: aFileTracker "Copyright(C) 1998 Masashi Umezawa All Rights Reserved. version: EA" fileTracker := aFileTracker! filterString "Copyright(C) 1998 Masashi Umezawa All Rights Reserved. version: EA" ^self fileTracker filterString! filterString: aFilterString "Copyright(C) 1998 Masashi Umezawa All Rights Reserved. version: EA" self fileTracker filterString: aFilterString! isRecursive "Copyright(C) 1998 Masashi Umezawa All Rights Reserved. version: EA" ^self fileTracker isRecursive! isRecursive: aBoolean "Copyright(C) 1998 Masashi Umezawa All Rights Reserved. version: EA" self fileTracker isRecursive: aBoolean! isVerbose "Copyright(C) 1998 Masashi Umezawa All Rights Reserved. version: EA" ^self fileTracker isVerbose! isVerbose: aBoolean "Copyright(C) 1998 Masashi Umezawa All Rights Reserved. version: EA" self fileTracker isVerbose: aBoolean! isWithLineEndChar "Copyright(C) 1998 Masashi Umezawa All Rights Reserved. version: EA" ^isWithLineEndChar! isWithLineEndChar: aBoolean "Copyright(C) 1998 Masashi Umezawa All Rights Reserved. version: EA" isWithLineEndChar := aBoolean! lineEndChar: aCharacter "Copyright(C) 1998 Masashi Umezawa All Rights Reserved. version: EA" lineEndChar := aCharacter! lineEndCode "Copyright(C) 1998 Masashi Umezawa All Rights Reserved. version: EA" ^lineEndCode! lineEndCode: anInteger "Copyright(C) 1998 Masashi Umezawa All Rights Reserved. version: EA" lineEndCode := anInteger! pathname "Copyright(C) 1998 Masashi Umezawa All Rights Reserved. version: EA" ^pathname! pathname: aPathname "Copyright(C) 1998 Masashi Umezawa All Rights Reserved. version: EA" pathname := aPathname! ! !FileManipulator methodsFor: 'private'! chopMarks: startMark and: endMark in: markedString "Copyright(C) 1998 Masashi Umezawa All Rights Reserved. version: EA" ^markedString copyFrom: startMark size + 1 to: markedString size - endMark size! findString: target including: deleteStringCollection all: allOrNot "Copyright(C) 1998 Masashi Umezawa All Rights Reserved. version: EA" | results | results := OrderedCollection new. deleteStringCollection do: [:each | results add: (target indexOfSubCollection: each startingAt: 1) > 0]. allOrNot ifTrue: [^(results includes: false) not] ifFalse: [^results includes: true]! lineEndChar "Copyright(C) 1998 Masashi Umezawa All Rights Reserved. version: EA" ^lineEndChar! lineEndOf: aStream To: lineEndSymbol "Copyright(C) 1998 Masashi Umezawa All Rights Reserved. version: EA" lineEndSymbol == #CR ifTrue: [aStream lineEndCR]. lineEndSymbol == #LF ifTrue: [aStream lineEndLF]. lineEndSymbol == #CRLF ifTrue: [aStream lineEndCRLF]. ^aStream! processFileContent: aProcessBlock "Copyright(C) 1998 Masashi Umezawa All Rights Reserved. version: EA" | doBlock | doBlock := [:filename | | rStr contents wStr | rStr := filename readStream. contents := rStr contents. contents := aProcessBlock value: contents. rStr close. wStr := filename newReadWriteStream. wStr nextPutAll: contents. wStr close]. self startFileTracker: doBlock! processFileContent: aProcessBlock between: startMark and: endMark "Copyright(C) 1998 Masashi Umezawa All Rights Reserved. version: EA" | doBlock | doBlock := [:filename | | rStr wStr newContents | rStr := filename readStream. newContents := (String new: 1024) writeStream. [rStr atEnd] whileFalse: [| beforeContents replaceContents | beforeContents := rStr upToAll: startMark. newContents nextPutAll: beforeContents. replaceContents := rStr throughAll: endMark. replaceContents := aProcessBlock value: replaceContents. newContents nextPutAll: replaceContents]. rStr close. wStr := filename newReadWriteStream. wStr nextPutAll: newContents contents. wStr close]. self startFileTracker: doBlock! processFileLine: aProcessBlock "Copyright(C) 1998 Masashi Umezawa All Rights Reserved. version: EA" | doBlock | doBlock := [:filename | | rStr newStream wStr | rStr := filename readStream. newStream := (String new: 1024) writeStream. [rStr atEnd] whileFalse: [| line | line := rStr through: self lineEndChar. line := aProcessBlock value: line. newStream nextPutAll: line]. rStr close. wStr := filename newReadWriteStream. wStr nextPutAll: newStream contents. wStr close]. self startFileTracker: doBlock! replaceString: contents usingDic: fromToDictionary "Copyright(C) 1998 Masashi Umezawa All Rights Reserved. version: EA" | cont | cont := contents. fromToDictionary keysAndValuesDo: [:from :to | cont := cont copyReplaceAll: from with: to]. ^cont! startFileTracker: aBlock "Copyright(C) 1998 Masashi Umezawa All Rights Reserved. version: EA" self fileTracker do: aBlock dirOf: self pathname! write: aString To: aWriteStream "Copyright(C) 1998 Masashi Umezawa All Rights Reserved. version: EA" self isWithLineEndChar ifTrue: [aWriteStream nextPut: self lineEndChar. aWriteStream nextPutAll: aString. aWriteStream nextPut: self lineEndChar] ifFalse: [aWriteStream nextPutAll: aString]. ^aWriteStream! writeHeader: aString To: aWriteStream "Copyright(C) 1998 Masashi Umezawa All Rights Reserved. version: EA" self isWithLineEndChar ifTrue: [aWriteStream nextPutAll: aString. aWriteStream nextPut: self lineEndChar] ifFalse: [aWriteStream nextPutAll: aString]. ^aWriteStream! ! "-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- "! FileManipulator class instanceVariableNames: ''! !FileManipulator class methodsFor: 'instance creation'! new "Copyright(C) 1998 Masashi Umezawa All Rights Reserved. version: EA" ^super new initialize! on: aPathname "Copyright(C) 1998 Masashi Umezawa All Rights Reserved. version: EA" ^self new pathname: aPathname! ! !FileManipulator class methodsFor: 'examples'! example1 "Copyright(C) 1998 Masashi Umezawa All Rights Reserved. version: EA" "self example1" | fm | fm := FileManipulator on: '.\test\test1'. fm replace: 'umezawa' with: 'umejava' between: '
' and: '
'! example2 "Copyright(C) 1998 Masashi Umezawa All Rights Reserved. version: EA" "self example2" | fm | fm := FileManipulator on: '.\test\test1'. "fm deleteLineIncludingCollection: #('<' '>')." fm deleteAllBetween: ''! example3 "Copyright(C) 1998 Masashi Umezawa All Rights Reserved. version: EA" "self example3" | fm | fm := FileManipulator on: '.\test\test1'. fm isWithLineEndChar: true. fm addHeader: ''. fm addFooter: ''! example4 "Copyright(C) 1998 Masashi Umezawa All Rights Reserved. version: EA" "self example4" | fm | fm := FileManipulator on: '.\test\test1'. fm isVerbose: true. fm isWithLineEndChar: true. fm catTo: 'temp.txt' insertHeader: '---kokokara---' footer: '--kokomade---'! example5 "Copyright(C) 1998 Masashi Umezawa All Rights Reserved. version: EA" "self example5" | fm | fm := FileManipulator on: '.\test\test1'. fm isVerbose: true. fm remove! example6 "Copyright(C) 1998 Masashi Umezawa All Rights Reserved. version: EA" "self example6" | fm | fm := FileManipulator on: '.\test\test1'. fm isVerbose: true. fm copyTo: 'C:\tmp\test'! example7 "Copyright(C) 1998 Masashi Umezawa All Rights Reserved. version: EA" "self example7" | fm | Transcript cr; show: StreamEncoder availableEncodings printString. fm := FileManipulator on: '.\test\test1'. fm isVerbose: true. fm encodeTo: #JapaneseEUC! example8 "Copyright(C) 1998 Masashi Umezawa All Rights Reserved. version: EA" "self example8" | fm | Transcript cr; show: StreamEncoder availableEncodings printString. fm := FileManipulator on: '.\test\test1'. fm isVerbose: true. fm lineEndFrom: #LF To: #CRLF! ! Object subclass: #FileTracker instanceVariableNames: 'targetDir isRecursive isVerbose fileShowBlock fileActionBlock directoryShowBlock directoryActionBlock filterString fileSortBlock fileSortPolicy ' classVariableNames: '' poolDictionaries: '' category: 'Ume-File-Util'! FileTracker comment: 'Copyright(C) 1998 Masashi Umezawa All Rights Reserved. version: EA '! !FileTracker methodsFor: 'initialize-release'! initialize "Copyright(C) 1998 Masashi Umezawa All Rights Reserved. version: EA" filterString := '*'. isRecursive := true. isVerbose := false. fileActionBlock := [:filename | ]. directoryActionBlock := [:filenameOfDir | ]. fileShowBlock := [:filenameString | Transcript cr; show: filenameString]. directoryShowBlock := [:directorynameString | Transcript cr; show: directorynameString]. fileSortBlock := [:x :y | x <= y]. fileSortPolicy = #alphabeical! ! !FileTracker methodsFor: 'actions'! do: aBlock dirOf: aPathname "Copyright(C) 1998 Masashi Umezawa All Rights Reserved. version: EA" | fname childFilenames childFilename dConts | fname := Filename named: aPathname. fname exists ifFalse: [^Dialog warn: 'pathname is wrong']. fname isDirectory ifFalse: [fname := fname directory]. targetDir := aPathname. childFilenames := OrderedCollection new. dConts := self fileSort: fname. dConts do: [:each | childFilename := fname construct: each. childFilename isDirectory ifTrue: [self directoryActionBlock value: childFilename. self isVerbose ifTrue: [self directoryShowBlock value: childFilename asString]. self isRecursive ifTrue: [self do: aBlock dirOf: childFilename asString]] ifFalse: [childFilenames add: childFilename]]. childFilenames do: [:each | self do: aBlock filenameOf: each]! do: aBlock filenameOf: aFilename "Copyright(C) 1998 Masashi Umezawa All Rights Reserved. version: EA" self fileActionBlock: aBlock. self doFilenameOf: aFilename! do: aBlock fileOf: aFilenameString "Copyright(C) 1998 Masashi Umezawa All Rights Reserved. version: EA" self do: aBlock fileNameOf: aFilenameString asFilename! doFilenameOf: aFilename "Copyright(C) 1998 Masashi Umezawa All Rights Reserved. version: EA" | tail | aFilename exists ifFalse: [^Dialog warn: 'File does not exist']. tail := aFilename tail. (self filterFileOf: tail) ifTrue: [self isVerbose ifTrue: [self fileShowBlock value: aFilename asString]. self fileActionBlock value: aFilename]! doFileOf: aFilenameString "Copyright(C) 1998 Masashi Umezawa All Rights Reserved. version: EA" self doFileNameOf: aFilenameString asFilename! track "Copyright(C) 1998 Masashi Umezawa All Rights Reserved. version: EA" ^self do: self fileActionBlock dirOf: self targetDir! ! !FileTracker methodsFor: 'private'! fileSort: aFilenameOfDir "Copyright(C) 1998 Masashi Umezawa All Rights Reserved. version: EA" | dConts po | po := self fileSortPolicy. dConts := aFilenameOfDir directoryContents. po == #alphabetical ifTrue: [^dConts]. (po == #size or: [po == #date]) ifTrue: [| sortBlock cols so | po == #size ifTrue: [sortBlock := [:x :y | x fileSize <= y fileSize]]. po == #date ifTrue: [| dateGetBlock | dateGetBlock := [:each | | tdArr | tdArr := each dates at: #modified. Timestamp fromDate: (tdArr at: 1) andTime: (tdArr at: 2)]. sortBlock := [:x :y | (dateGetBlock value: x) < (dateGetBlock value: y)]]. cols := dConts collect: [:each | each asFilename]. so := SortedCollection withAll: cols sortBlock: sortBlock. ^so collect: [:each | each asString]]. ^SortedCollection withAll: dConts sortBlock: self fileSortBlock! filterFileOf: aFile "Copyright(C) 1998 Masashi Umezawa All Rights Reserved. version: EA" ^self filterString match: aFile! ! !FileTracker methodsFor: 'accessing'! directoryActionBlock "Copyright(C) 1998 Masashi Umezawa All Rights Reserved. version: EA" ^directoryActionBlock! directoryActionBlock: aBlock "Copyright(C) 1998 Masashi Umezawa All Rights Reserved. version: EA" directoryActionBlock := aBlock! directoryShowBlock "Copyright(C) 1998 Masashi Umezawa All Rights Reserved. version: EA" ^directoryShowBlock! directoryShowBlock: aBlock "Copyright(C) 1998 Masashi Umezawa All Rights Reserved. version: EA" directoryShowBlock := aBlock! fileActionBlock "Copyright(C) 1998 Masashi Umezawa All Rights Reserved. version: EA" ^fileActionBlock! fileActionBlock: aBlock "Copyright(C) 1998 Masashi Umezawa All Rights Reserved. version: EA" fileActionBlock := aBlock! fileShowBlock "Copyright(C) 1998 Masashi Umezawa All Rights Reserved. version: EA" ^fileShowBlock! fileShowBlock: aBlock "Copyright(C) 1998 Masashi Umezawa All Rights Reserved. version: EA" fileShowBlock := aBlock! fileSortBlock "Copyright(C) 1998 Masashi Umezawa All Rights Reserved. version: EA" ^fileSortBlock! fileSortBlock: aBlock "Copyright(C) 1998 Masashi Umezawa All Rights Reserved. version: EA" fileSortBlock := aBlock! fileSortPolicy "Copyright(C) 1998 Masashi Umezawa All Rights Reserved. version: EA" ^fileSortPolicy! fileSortPolicy: aSymbol "Copyright(C) 1998 Masashi Umezawa All Rights Reserved. version: EA" fileSortPolicy := aSymbol! filterString "Copyright(C) 1998 Masashi Umezawa All Rights Reserved. version: EA" ^filterString! filterString: aValue "Copyright(C) 1998 Masashi Umezawa All Rights Reserved. version: EA" filterString := aValue! isRecursive "Copyright(C) 1998 Masashi Umezawa All Rights Reserved. version: EA" ^isRecursive! isRecursive: aBoolean "Copyright(C) 1998 Masashi Umezawa All Rights Reserved. version: EA" isRecursive := aBoolean! isVerbose "Copyright(C) 1998 Masashi Umezawa All Rights Reserved. version: EA" ^isVerbose! isVerbose: aBoolean "Copyright(C) 1998 Masashi Umezawa All Rights Reserved. version: EA" isVerbose := aBoolean! showBlock: aBlock "Copyright(C) 1998 Masashi Umezawa All Rights Reserved. version: EA" fileShowBlock := aBlock! targetDir "Copyright(C) 1998 Masashi Umezawa All Rights Reserved. version: EA" ^targetDir! targetDir: aPathname "Copyright(C) 1998 Masashi Umezawa All Rights Reserved. version: EA" targetDir := aPathname! ! "-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- "! FileTracker class instanceVariableNames: ''! !FileTracker class methodsFor: 'instance creation'! new "Copyright(C) 1998 Masashi Umezawa All Rights Reserved. version: EA" ^super new initialize! ! !FileTracker class methodsFor: 'examples'! example1 "Copyright(C) 1998 Masashi Umezawa All Rights Reserved. version: EA" "self example1" | ft | ft := FileTracker new. ft do: [:filename | Transcript cr; show: filename printString] dirOf: '.'! example2 "Copyright(C) 1998 Masashi Umezawa All Rights Reserved. version: EA" "self example2" | ft | ft := FileTracker new. ft isVerbose: true. ft filterString: '*.txt'. ft do: [:filename | Transcript cr; show: filename printString] dirOf: '.'! example3 "Copyright(C) 1998 Masashi Umezawa All Rights Reserved. version: EA" "self example3" | ft | ft := FileTracker new. ft directoryActionBlock: [:dir | "ft isVerbose: true." Transcript cr; show: '###DIR###'; tab; show: dir asString]. ft fileActionBlock: [:filename | Transcript cr; show: filename printString]. ft targetDir: '.'. ft track! example4 "Copyright(C) 1998 Masashi Umezawa All Rights Reserved. version: EA" "self example4" | ft | ft := FileTracker new. ft isVerbose: true. ft directoryActionBlock: [:dir | Transcript cr; show: '###DIR###'; tab; show: dir asString]. ft fileActionBlock: [:filename | Transcript cr; show: filename printString]. ft targetDir: '.'. ft fileSortPolicy: #size. ft track! ! Object subclass: #DirectoryMaker instanceVariableNames: 'pathnameString ' classVariableNames: 'SeparatorString ' poolDictionaries: '' category: 'Ume-File-Util'! DirectoryMaker comment: 'Copyright(C) 1998 Masashi Umezawa All Rights Reserved. version: EA '! !DirectoryMaker methodsFor: 'initialize-release'! initialize "Copyright(C) 1998 Masashi Umezawa All Rights Reserved. version: EA" pathnameString := ''! ! !DirectoryMaker methodsFor: 'directory making'! make "Copyright(C) 1998 Masashi Umezawa All Rights Reserved. version: EA" | fnames | fnames := self filenameComponentsFrom: self pathnameString. fnames do: [:each | each exists ifFalse: [each makeDirectory]]. ^fnames! ! !DirectoryMaker methodsFor: 'private'! filenameComponentsFrom: aPathnameString "Copyright(C) 1998 Masashi Umezawa All Rights Reserved. version: EA" | ord results separatorString | results := OrderedCollection new. separatorString := self class separatorString. ord := Filename defaultClass components: aPathnameString. ord inject: '' into: [:cat :next | | fnameStr | cat isEmpty ifTrue: [fnameStr := next] ifFalse: [fnameStr := cat , separatorString , next]. results add: (Filename named: fnameStr). fnameStr]. ^results! ! !DirectoryMaker methodsFor: 'accessing'! pathnameString "Copyright(C) 1998 Masashi Umezawa All Rights Reserved. version: EA" ^pathnameString! pathnameString: aString "Copyright(C) 1998 Masashi Umezawa All Rights Reserved. version: EA" pathnameString := aString! ! "-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- "! DirectoryMaker class instanceVariableNames: ''! !DirectoryMaker class methodsFor: 'class initialization'! initialize "Copyright(C) 1998 Masashi Umezawa All Rights Reserved. version: EA" SeparatorString := String with: Filename separator! ! !DirectoryMaker class methodsFor: 'instance creation'! new "Copyright(C) 1998 Masashi Umezawa All Rights Reserved. version: EA" ^super new initialize! on: aPathnameString "Copyright(C) 1998 Masashi Umezawa All Rights Reserved. version: EA" ^self new pathnameString: aPathnameString! ! !DirectoryMaker class methodsFor: 'accessing'! separatorString "Copyright(C) 1998 Masashi Umezawa All Rights Reserved. version: EA" ^SeparatorString! separatorString: aString "Copyright(C) 1998 Masashi Umezawa All Rights Reserved. version: EA" SeparatorString := aString! ! !DirectoryMaker class methodsFor: 'examples'! example1 "Copyright(C) 1998 Masashi Umezawa All Rights Reserved. version: EA" "self example1" | dm | dm := DirectoryMaker on: 'C:\temp\test\aaa'. dm make! ! DirectoryMaker initialize!