#FEATURE by stefan
authorStefan Vogel <sv@exept.de>
Thu, 28 Mar 2019 14:53:59 +0100
changeset 24007 9ef4393a3da1
parent 24006 5eedbb97db6a
child 24008 cd8978bc0fba
#FEATURE by stefan class: AbstractOperatingSystem class added: #recursiveCreateDirectory:forEachCreatedDo: changed: #recursiveCreateDirectory:
AbstractOperatingSystem.st
--- 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'
     "