FileOperation.st
changeset 6168 45a19dfda66b
parent 6153 8f3553c07ccf
child 6185 d366b36841fd
--- a/FileOperation.st	Fri Jan 14 12:22:39 2005 +0100
+++ b/FileOperation.st	Thu Jan 20 14:03:36 2005 +0100
@@ -1,3 +1,15 @@
+"
+ COPYRIGHT (c) 2003 by eXept Software AG
+              All Rights Reserved
+
+ This software is furnished under a license and may be used
+ only in accordance with the terms of that license and with the
+ inclusion of the above copyright notice.   This software may not
+ be provided or otherwise made available to, or used by, any
+ other person.  No title to or ownership of the software is
+ hereby transferred.
+"
+
 "{ Package: 'stx:libtool2' }"
 
 Object subclass:#FileOperation
@@ -28,6 +40,13 @@
 	privateIn:FileOperation
 !
 
+FileOperation::Delete subclass:#Erase
+	instanceVariableNames:''
+	classVariableNames:''
+	poolDictionaries:''
+	privateIn:FileOperation
+!
+
 FileOperation subclass:#Move
 	instanceVariableNames:'colOfMovedFiles'
 	classVariableNames:''
@@ -42,6 +61,21 @@
 	privateIn:FileOperation
 !
 
+!FileOperation class methodsFor:'documentation'!
+
+copyright
+"
+ COPYRIGHT (c) 2003 by eXept Software AG
+              All Rights Reserved
+
+ This software is furnished under a license and may be used
+ only in accordance with the terms of that license and with the
+ inclusion of the above copyright notice.   This software may not
+ be provided or otherwise made available to, or used by, any
+ other person.  No title to or ownership of the software is
+ hereby transferred.
+"
+! !
 
 !FileOperation class methodsFor:'actions'!
 
@@ -84,69 +118,60 @@
     ^ Delete deleteFiles:colOfFiles confirm:confirm
 !
 
+eraseFiles:colOfFiles confirm:confirm
+    ^ Erase deleteFiles:colOfFiles confirm:confirm
+!
+
 moveFile:aSourceFile to:aDestFile
-    ^ Move 
-        moveFile:aSourceFile to:aDestFile
+    ^ Move moveFile:aSourceFile to:aDestFile
 !
 
 moveFiles:aCollectionOfFiles to:aDestDirectory
-    ^ Move 
-        moveFiles:aCollectionOfFiles to:aDestDirectory
+    ^ Move moveFiles:aCollectionOfFiles to:aDestDirectory
 !
 
 renameFile:filename to:newFileString
-    ^ Rename 
-        renameFile:filename to:newFileString
+    ^ Rename renameFile:filename to:newFileString
 !
 
 renameFiles:aCollectionofFilenames
-    ^ Rename 
-        renameFiles:aCollectionofFilenames
+    ^ Rename renameFiles:aCollectionofFilenames
 ! !
 
 !FileOperation class methodsFor:'defaults'!
 
-copyMoveIfExistSuffixString
-
+suffixForCopyOverExistingFile
     ^ '.copy'
 ! !
 
 !FileOperation methodsFor:'accessing'!
 
 errorString
-    "return the value of the static variable 'ErrorString' (automatically generated)"
-
     ^ errorString
 !
 
 errorString:something
-    "set the value of the static variable 'ErrorString' (automatically generated)"
-
     errorString := something.
 !
 
 result
-    "return the value of the instance variable 'result' (automatically generated)"
-
     ^ result
 !
 
 result:something
-    "set the value of the instance variable 'result' (automatically generated)"
-
     result := something.
 ! !
 
 !FileOperation methodsFor:'dialogs'!
 
-fileExistDialogForNewFile:newFile oldFile:oldFile withCancel:withCancel
+fileExistsDialogForNewFile:newFile oldFile:oldFile withCancel:withCancel
     "return true, if the file should be moved/copied.
      Ask user if oldFile exists."
 
-    ^ self fileExistDialogForNewFile:newFile oldFile:oldFile withCancel:withCancel withRemoveIfSame:false.
+    ^ self fileExistsDialogForNewFile:newFile oldFile:oldFile withCancel:withCancel withRemoveIfSame:false.
 !
 
-fileExistDialogForNewFile:newFile oldFile:oldFile withCancel:withCancel withRemoveIfSame:withRemoveIfSame
+fileExistsDialogForNewFile:newFile oldFile:oldFile withCancel:withCancel withRemoveIfSame:withRemoveIfSame
     "return true, if the file should be moved/copied.
      If oldFile exists, ask user.
      If withRemoveIfSame is true, two additional possible values are returned:
@@ -215,9 +240,6 @@
 !FileOperation::Copy class methodsFor:'actions'!
 
 copyFile:aSourceFile to:aDestFile
-    "delete current selected files/directories
-    "
-
     |instance|
 
     instance := self new.
@@ -226,9 +248,6 @@
 !
 
 copyFile:aSourceFile to:aDestFile withOverWriteWarning:overWriteWarning
-    "delete current selected files/directories
-    "
-
     |instance|
 
     instance := self new.
@@ -237,9 +256,6 @@
 !
 
 copyFile:aSourceFile to:aDestFile withOverWriteWarning:overWriteWarningBoolean copyFileIfSame:copyIfSameBoolean
-    "delete current selected files/directories
-    "
-
     |instance|
 
     instance := self new.
@@ -248,9 +264,6 @@
 !
 
 copyFiles:aColOfSourceFiles to:aDirectory
-    "delete current selected files/directories
-    "
-
     |instance|
 
     instance := self new.
@@ -259,9 +272,6 @@
 !
 
 copyFiles:aColOfSourceFiles to:aDirectory withOverWriteWarning:overWriteWarning
-    "delete current selected files/directories
-    "
-
     |instance|
 
     instance := self new.
@@ -270,9 +280,6 @@
 !
 
 copyFiles:aColOfSourceFiles to:aDirectory withOverWriteWarning:overWriteWarning copyFileIfSame:copy
-    "delete current selected files/directories
-    "
-
     |instance|
 
     instance := self new.
@@ -283,8 +290,6 @@
 !FileOperation::Copy methodsFor:'accessing'!
 
 colOfCopiedFiles
-    "return the value of the instance variable 'colOfCopiedFiles' (automatically generated)"
-
     colOfCopiedFiles isNil ifTrue:[
         colOfCopiedFiles := OrderedCollection new.
     ].
@@ -294,23 +299,14 @@
 !FileOperation::Copy methodsFor:'actions'!
 
 copyFile:aSourceFile to:aDestFile
-    "defete current selected files/directories
-    "
-
     self copyFile:aSourceFile to:aDestFile withOverWriteWarning:true
 !
 
 copyFile:aSourceFile to:aDestFile withOverWriteWarning:overWriteWarning
-    "copy to
-    "
-
     self copyFile:aSourceFile to:aDestFile withOverWriteWarning:true copyFileIfSame:true
 !
 
 copyFile:aSourceFile to:aDestFile withOverWriteWarning:overWriteWarningBoolean copyFileIfSame:copyIfSameBoolean
-    "copy to
-    "
-
     |newFile fileString targetDirectory targetIsDirectory sourceIsDirectory suffix|
 
     sourceIsDirectory := aSourceFile isDirectory.
@@ -332,12 +328,12 @@
         ((newFile asString = aSourceFile asString) and:[copyIfSameBoolean]) ifTrue:[
             [newFile exists] whileTrue:[
                 suffix := newFile suffix.
-                fileString := newFile baseName withoutSuffix, self class copyMoveIfExistSuffixString, '.', suffix.
+                fileString := newFile baseName withoutSuffix, self class suffixForCopyOverExistingFile, '.', suffix.
                 newFile := targetDirectory construct:fileString.
             ].
         ] ifFalse:[
             overWriteWarningBoolean ifTrue:[
-                (self fileExistDialogForNewFile:newFile oldFile:aSourceFile withCancel:false withRemoveIfSame:false) ifFalse:[ 
+                (self fileExistsDialogForNewFile:newFile oldFile:aSourceFile withCancel:false withRemoveIfSame:false) ifFalse:[ 
                     result := false.
                     ^ self.
                 ]
@@ -365,18 +361,14 @@
 !
 
 copyFiles:aColOfSourceFiles to:aDirectory
-
     ^ self copyFiles:aColOfSourceFiles to:aDirectory withOverWriteWarning:true. 
 !
 
 copyFiles:aColOfSourceFiles to:aDirectory withOverWriteWarning:overWriteWarning 
-
     ^ self copyFiles:aColOfSourceFiles to:aDirectory withOverWriteWarning:overWriteWarning copyFileIfSame:true.
 !
 
 copyFiles:aColOfSourceFiles to:aDirectory withOverWriteWarning:overWriteWarning copyFileIfSame:copy
-
-
     |newFile suffix fileString sourceIsDirectory overWriteExisting|
 
     (aDirectory exists) ifFalse:[
@@ -397,7 +389,7 @@
             ((newFile asString = filename asString) and:[copy]) ifTrue:[
                 [newFile exists] whileTrue:[
                     suffix := newFile suffix.
-                    fileString := newFile withoutSuffix baseName, self class copyMoveIfExistSuffixString.
+                    fileString := newFile withoutSuffix baseName, self class suffixForCopyOverExistingFile.
                     suffix notEmpty ifTrue:[
                         fileString := fileString, '.', suffix.
                     ].
@@ -405,7 +397,7 @@
                 ].
             ] ifFalse:[
                 overWriteWarning ifTrue:[
-                    overWriteExisting := (self fileExistDialogForNewFile:newFile oldFile:filename withCancel:(aColOfSourceFiles size > 1) withRemoveIfSame:false).
+                    overWriteExisting := (self fileExistsDialogForNewFile:newFile oldFile:filename withCancel:(aColOfSourceFiles size > 1) withRemoveIfSame:false).
                     overWriteExisting isNil ifTrue:[
                         " abort pressed "
                         result := false.
@@ -497,14 +489,10 @@
 !FileOperation::Create methodsFor:'accessing'!
 
 createdFile
-    "return the value of the instance variable 'createdFile' (automatically generated)"
-
     ^ createdFile
 !
 
 createdFile:something
-    "set the value of the instance variable 'createdFile' (automatically generated)"
-
     createdFile := something.
 ! !
 
@@ -746,8 +734,7 @@
 !FileOperation::Delete class methodsFor:'actions'!
 
 deleteFile:aFileOrDirectory
-    "delete current selected files/directories
-    "
+    "delete aFileOrDirectory"
 
     |instance|
 
@@ -756,27 +743,23 @@
     ^ instance
 !
 
-deleteFiles:aColOfFiles
-    "delete current selected files/directories
-    "
-    ^ self deleteFiles:aColOfFiles confirm:true
+deleteFiles:aCollectionOfFiles
+    ^ self deleteFiles:aCollectionOfFiles confirm:true
 !
 
-deleteFiles:aColOfFiles confirm:confirm
-    "delete current selected files/directories
-    "
+deleteFiles:aCollectionOfFiles confirm:confirm
+    "delete aCollectionOfFiles"
 
     |instance|
 
     instance := self new.
-    instance deleteFiles:aColOfFiles confirm:confirm.
+    instance deleteFiles:aCollectionOfFiles confirm:confirm.
     ^ instance
 ! !
 
 !FileOperation::Delete methodsFor:'actions'!
 
 deleteFile:aFileOrDirectory
-
     | file isDirectory |
 
     aFileOrDirectory notNil ifTrue:[
@@ -787,13 +770,16 @@
         Error handle:[:ex|
             "was not able to remove it"
             Dialog warn:(ex description, '\' withCRs, ex signal notifierString).
-"/                Smalltalk beep.
             self errorString:(ex description, ' - ', ex signal notifierString).
             result := false.
             ^ self.
         ] do:[
-            isDirectory ifTrue:[file recursiveRemove] ifFalse:[file remove].
-
+            isDirectory ifTrue:[
+                file recursiveRemove
+            ] ifFalse:[
+                self eraseFilesContentsBeforeRemoving:file.
+                file remove
+            ].
         ].
         "/ flush parent directory or directory
     ].
@@ -804,14 +790,10 @@
 !
 
 deleteFiles:colOfFiles
-    "delete current selected files/directories
-    "
     ^ self deleteFiles:colOfFiles confirm:true.
 !
 
 deleteFiles:colOfFiles confirm:confirm
-    "delete current selected files/directories
-    "
     |resources answer nFilesToDelete ask labels values fileTypeString msg lbls vals|
 
     ask := confirm.
@@ -905,14 +887,44 @@
             ].
         ].
     ].
+!
+
+eraseFilesContentsBeforeRemoving:file
+    "intentionally left blank"
+! !
+
+!FileOperation::Erase methodsFor:'actions'!
+
+eraseFilesContentsBeforeRemoving
+    "fill file with zeros"
+
+    self halt.
+!
+
+eraseFilesContentsBeforeRemoving:file
+    "fill file with zeros (to be really erased from the disk)"
+
+    |writeStream fileSize remaining buffer bufferSize nWritten|
+
+    fileSize := file fileSize.
+    writeStream := file asFilename readWriteStream.
+
+    remaining := fileSize.    
+    bufferSize := 8192.
+    buffer := ByteArray new:bufferSize.
+    [remaining > 0] whileTrue:[
+        nWritten := writeStream 
+            nextPutBytes:(bufferSize min:remaining)
+            from:buffer
+            startingAt:1.
+        remaining := remaining - nWritten.
+    ].
+    writeStream close.
 ! !
 
 !FileOperation::Move class methodsFor:'actions'!
 
 moveFile:aSourceFile to:aDestFile
-    "delete current selected files/directories
-    "
-
     |instance|
 
     instance := self new.
@@ -921,9 +933,6 @@
 !
 
 moveFile:aSourceFile to:aDestFile withOverWriteWarning:overWriteWarning
-    "delete current selected files/directories
-    "
-
     |instance|
 
     instance := self new.
@@ -932,9 +941,6 @@
 !
 
 moveFile:aSourceFile to:aDestFile withOverWriteWarning:overWriteWarning moveFileIfSame:move
-    "delete current selected files/directories
-    "
-
     |instance|
 
     instance := self new.
@@ -943,9 +949,6 @@
 !
 
 moveFiles:aColOfSourceFiles to:aDirectory
-    "delete current selected files/directories
-    "
-
     |instance|
 
     instance := self new.
@@ -954,9 +957,6 @@
 !
 
 moveFiles:aColOfSourceFiles to:aDirectory withOverWriteWarning:overWriteWarning
-    "delete current selected files/directories
-    "
-
     |instance|
 
     instance := self new.
@@ -965,9 +965,6 @@
 !
 
 moveFiles:aColOfSourceFiles to:aDirectory withOverWriteWarning:overWriteWarning moveFileIfSame:move
-    "delete current selected files/directories
-    "
-
     |instance|
 
     instance := self new.
@@ -978,8 +975,6 @@
 !FileOperation::Move methodsFor:'accessing'!
 
 colOfMovedFiles
-    "return the value of the instance variable 'colOfMovedFiles' (automatically generated)"
-
     colOfMovedFiles isNil ifTrue:[
         colOfMovedFiles := OrderedCollection new.
     ].
@@ -1020,12 +1015,12 @@
         ((newFile asString = aSourceFile asString) and:[move]) ifTrue:[
             [newFile exists] whileTrue:[
                 suffix := newFile suffix.
-                fileString := newFile baseName withoutSuffix, self class copyMoveIfExistSuffixString, '.', suffix.
+                fileString := newFile baseName withoutSuffix, self class suffixForCopyOverExistingFile, '.', suffix.
                 newFile := targetDirectory construct:fileString.
             ].
         ] ifFalse:[
             overWriteWarning ifTrue:[
-                doMove := self fileExistDialogForNewFile:newFile oldFile:aSourceFile withCancel:false withRemoveIfSame:true.
+                doMove := self fileExistsDialogForNewFile:newFile oldFile:aSourceFile withCancel:false withRemoveIfSame:true.
                 doMove == #removeSource ifTrue:[ 
                     self halt.
                     result := false.
@@ -1106,12 +1101,12 @@
             ((newFile asString = filename asString) and:[move]) ifTrue:[
                 [newFile exists] whileTrue:[
                     suffix := newFile suffix.
-                    fileString := newFile withoutSuffix baseName , self class copyMoveIfExistSuffixString, '.', suffix.
+                    fileString := newFile withoutSuffix baseName , self class suffixForCopyOverExistingFile, '.', suffix.
                     newFile := aDirectory construct:fileString.
                 ].
             ] ifFalse:[
                 overWriteWarning ifTrue:[
-                    doMove := self fileExistDialogForNewFile:newFile oldFile:filename withCancel:(aColOfSourceFiles size > 1) withRemoveIfSame:true.
+                    doMove := self fileExistsDialogForNewFile:newFile oldFile:filename withCancel:(aColOfSourceFiles size > 1) withRemoveIfSame:true.
                     doMove isNil ifTrue:[   "/ cancel
                         result := false.
                         ^ self.
@@ -1166,9 +1161,6 @@
 !FileOperation::Rename class methodsFor:'actions'!
 
 renameFile:oldFile to:newName
-    "move from to
-    "
-
     |instance|
 
     instance := self new.
@@ -1177,9 +1169,6 @@
 !
 
 renameFiles:aColOfFiles 
-    "move from to
-    "
-
     |instance|
 
     instance := self new.
@@ -1190,8 +1179,6 @@
 !FileOperation::Rename methodsFor:'accessing'!
 
 renamedFiles
-    "return the value of the instance variable 'lastRenamedFile' (automatically generated)"
-
     renamedFiles isNil ifTrue:[
         renamedFiles := OrderedCollection new.
     ].
@@ -1256,8 +1243,6 @@
 !
 
 renameFiles:aColOfFiles 
-    "rename the selected file(s)"
-
     |resources queryBox b lastNewName lastOldName initialText oldName newName renameAll doRename|
 
     resources := AbstractFileBrowser classResources.
@@ -1300,5 +1285,5 @@
 !FileOperation class methodsFor:'documentation'!
 
 version
-    ^ '$Header: /cvs/stx/stx/libtool/FileOperation.st,v 1.63 2004-12-13 22:09:01 cg Exp $'
+    ^ '$Header: /cvs/stx/stx/libtool/FileOperation.st,v 1.64 2005-01-20 13:03:36 cg Exp $'
 ! !