#FEATURE by stefan
class: AbstractOperatingSystem class
added: #recursiveCreateDirectory:forEachCreatedDo:
changed: #recursiveCreateDirectory:
--- a/AbstractOperatingSystem.st Thu Mar 28 12:46:22 2019 +0100
+++ b/AbstractOperatingSystem.st Thu Mar 28 14:53:59 2019 +0100
@@ -3109,24 +3109,68 @@
Return nil if successful, an OsErrorHolder otherwise.
On error, a partial created tree may be left, which is not cleaned-up here."
- |osErrorHolder nextDirName|
-
- self createDirectory:dirName.
- (self isDirectory:dirName) ifFalse:[
- nextDirName := dirName asFilename directoryName.
- dirName ~= nextDirName ifTrue:[
- osErrorHolder := self recursiveCreateDirectory:nextDirName.
- osErrorHolder notNil ifTrue:[
- ^ osErrorHolder.
- ].
- ].
- ^ self createDirectory:dirName.
+ ^ self recursiveCreateDirectory:dirName forEachCreatedDo:nil.
+
+
+ "
+ OperatingSystem recursiveCreateDirectory:'foo/bar/baz'.
+ OperatingSystem recursiveRemoveDirectory:'foo'
+
+ OperatingSystem recursiveCreateDirectory:'k:\bla\quark'
+ "
+
+ "Modified: 7.3.1996 / 15:26:22 / cg"
+!
+
+recursiveCreateDirectory:dirName forEachCreatedDo:aOneArgBlock
+ "create a directory - with all parent dirs if needed.
+ Return nil if successful, an OsErrorHolder otherwise.
+
+ For each created directory evaluate aOneArgBlock with the
+ filename of the created directory.
+
+ On error, a partial created tree may be left, which is not cleaned-up here."
+
+ |osErrorHolder parentDirName|
+
+
+ (osErrorHolder := self createDirectory:dirName) isNil ifTrue:[
+ "no error"
+ aOneArgBlock notNil ifTrue:[
+ aOneArgBlock value:dirName asFilename.
+ ].
+ ^ nil.
].
- ^ nil.
-
- "
- OperatingSystem recursiveCreateDirectory:'foo/bar/baz'
- OperatingSystem recursiveRemoveDirectory:'foo'
+
+ osErrorHolder errorCategory ~~ #nonexistentSignal ifTrue:[
+ ^ osErrorHolder.
+ ].
+
+ "create failed because parent does not exist, try to create parent directorie(s)"
+ parentDirName := dirName asFilename directory osNameForDirectory.
+ dirName ~= parentDirName ifTrue:[
+ osErrorHolder := self recursiveCreateDirectory:parentDirName forEachCreatedDo:aOneArgBlock.
+ osErrorHolder notNil ifTrue:[
+ ^ osErrorHolder.
+ ].
+ ].
+
+ "parent directory chain has been created, try again"
+ osErrorHolder := self createDirectory:dirName.
+ osErrorHolder isNil ifTrue:[
+ aOneArgBlock notNil ifTrue:[
+ aOneArgBlock value:dirName asFilename.
+ ].
+ ].
+ ^ osErrorHolder.
+
+ "
+ OperatingSystem
+ recursiveCreateDirectory:'/tmp/bla/fasel/murks'
+ forEachCreatedDo:[:name| self halt].
+
+ OperatingSystem recursiveRemoveDirectory:'/tmp/bla'.
+
OperatingSystem recursiveCreateDirectory:'k:\bla\quark'
"