FileURI.st
author tm
Thu, 24 Jul 2003 11:29:43 +0200
changeset 1284 57550436b55b
parent 1271 ca2e206e7c7f
child 1309 c752d54f4e09
permissions -rw-r--r--
file exists error handling
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
1005
7ed6fa7ccfba initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
     1
"{ Package: 'stx:libbasic2' }"
7ed6fa7ccfba initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
     2
7ed6fa7ccfba initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
     3
HierarchicalURI subclass:#FileURI
7ed6fa7ccfba initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
     4
	instanceVariableNames:''
7ed6fa7ccfba initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
     5
	classVariableNames:''
7ed6fa7ccfba initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
     6
	poolDictionaries:''
7ed6fa7ccfba initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
     7
	category:'Resources'
7ed6fa7ccfba initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
     8
!
7ed6fa7ccfba initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
     9
7ed6fa7ccfba initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    10
7ed6fa7ccfba initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    11
!FileURI class methodsFor:'instance creation'!
7ed6fa7ccfba initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    12
7ed6fa7ccfba initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    13
fromFilename:aFilename
7ed6fa7ccfba initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    14
    "create an URI based on an a filename"
7ed6fa7ccfba initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    15
7ed6fa7ccfba initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    16
    ^ self new fromFilename:aFilename
7ed6fa7ccfba initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    17
! !
7ed6fa7ccfba initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    18
7ed6fa7ccfba initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    19
!FileURI class methodsFor:'accessing'!
7ed6fa7ccfba initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    20
7ed6fa7ccfba initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    21
schemes
7ed6fa7ccfba initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    22
    "answer the list of supported schemes"
7ed6fa7ccfba initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    23
7ed6fa7ccfba initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    24
    ^ #(file)
7ed6fa7ccfba initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    25
! !
7ed6fa7ccfba initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    26
7ed6fa7ccfba initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    27
!FileURI methodsFor:'converting'!
7ed6fa7ccfba initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    28
7ed6fa7ccfba initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    29
asFilename
7ed6fa7ccfba initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    30
    "answer the receiver represented as filename"
7ed6fa7ccfba initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    31
7ed6fa7ccfba initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    32
    ^ authority notNil ifTrue:[
7ed6fa7ccfba initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    33
        Filename remoteHost:authority rootComponents:pathSegments.
7ed6fa7ccfba initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    34
    ] ifFalse:[
1268
48b43aebf125 Fix for home directories
Stefan Vogel <sv@exept.de>
parents: 1267
diff changeset
    35
        "kludge"
48b43aebf125 Fix for home directories
Stefan Vogel <sv@exept.de>
parents: 1267
diff changeset
    36
        (pathSegments first startsWith:$~) ifTrue:[
48b43aebf125 Fix for home directories
Stefan Vogel <sv@exept.de>
parents: 1267
diff changeset
    37
            pathSegments first asFilename construct:(Filename rootComponents:(pathSegments copyFrom:2)).
48b43aebf125 Fix for home directories
Stefan Vogel <sv@exept.de>
parents: 1267
diff changeset
    38
        ] ifFalse:[
48b43aebf125 Fix for home directories
Stefan Vogel <sv@exept.de>
parents: 1267
diff changeset
    39
            Filename rootComponents:pathSegments.
48b43aebf125 Fix for home directories
Stefan Vogel <sv@exept.de>
parents: 1267
diff changeset
    40
        ].
1005
7ed6fa7ccfba initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    41
    ].
1268
48b43aebf125 Fix for home directories
Stefan Vogel <sv@exept.de>
parents: 1267
diff changeset
    42
48b43aebf125 Fix for home directories
Stefan Vogel <sv@exept.de>
parents: 1267
diff changeset
    43
    "
48b43aebf125 Fix for home directories
Stefan Vogel <sv@exept.de>
parents: 1267
diff changeset
    44
        (URI fromString:'file:~/bla') asFilename
48b43aebf125 Fix for home directories
Stefan Vogel <sv@exept.de>
parents: 1267
diff changeset
    45
        (URI fromString:'file:~root/bla') asFilename 
48b43aebf125 Fix for home directories
Stefan Vogel <sv@exept.de>
parents: 1267
diff changeset
    46
    "
1005
7ed6fa7ccfba initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    47
! !
7ed6fa7ccfba initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    48
7ed6fa7ccfba initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    49
!FileURI methodsFor:'initialize'!
7ed6fa7ccfba initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    50
7ed6fa7ccfba initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    51
fromFilename:aFilename
7ed6fa7ccfba initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    52
    "create an URI based on an a filename"
7ed6fa7ccfba initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    53
7ed6fa7ccfba initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    54
    |components|
7ed6fa7ccfba initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    55
7ed6fa7ccfba initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    56
    components := aFilename components.
7ed6fa7ccfba initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    57
    aFilename isAbsolute ifTrue:[
7ed6fa7ccfba initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    58
        (components size > 3 and:[(components at:2) size == 0]) ifTrue:[
7ed6fa7ccfba initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    59
            "this is a MS-Windows network path: \\host\path"
7ed6fa7ccfba initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    60
            authority := components at:3.
7ed6fa7ccfba initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    61
            pathSegments := components copyFrom:4.
7ed6fa7ccfba initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    62
        ] ifFalse:[
7ed6fa7ccfba initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    63
            "this is an absolute path"
7ed6fa7ccfba initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    64
            isAbsolute := true.
7ed6fa7ccfba initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    65
            pathSegments := components copyFrom:2.
7ed6fa7ccfba initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    66
        ].
7ed6fa7ccfba initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    67
    ] ifFalse:[
7ed6fa7ccfba initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    68
        "this is a relative path"
7ed6fa7ccfba initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    69
        isAbsolute := false.
7ed6fa7ccfba initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    70
        pathSegments := components.
7ed6fa7ccfba initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    71
    ]
7ed6fa7ccfba initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    72
7ed6fa7ccfba initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    73
    "
1258
a0eda4db4dad fileTransfer
tm
parents: 1254
diff changeset
    74
      self fromFilename:'/a/b/c'  asFilename   
a0eda4db4dad fileTransfer
tm
parents: 1254
diff changeset
    75
      self fromFilename:'//a/b/c' asFilename  
a0eda4db4dad fileTransfer
tm
parents: 1254
diff changeset
    76
      self fromFilename:'a/b/c'   asFilename    
1005
7ed6fa7ccfba initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    77
    "
7ed6fa7ccfba initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    78
! !
7ed6fa7ccfba initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    79
1254
baf01931b9d6 *** empty log message ***
tm
parents: 1005
diff changeset
    80
!FileURI methodsFor:'queries'!
baf01931b9d6 *** empty log message ***
tm
parents: 1005
diff changeset
    81
1271
ca2e206e7c7f Working version: tilde-expansion, patterns
Stefan Vogel <sv@exept.de>
parents: 1268
diff changeset
    82
exists
1254
baf01931b9d6 *** empty log message ***
tm
parents: 1005
diff changeset
    83
baf01931b9d6 *** empty log message ***
tm
parents: 1005
diff changeset
    84
    ^ self asFilename exists
baf01931b9d6 *** empty log message ***
tm
parents: 1005
diff changeset
    85
! !
baf01931b9d6 *** empty log message ***
tm
parents: 1005
diff changeset
    86
1005
7ed6fa7ccfba initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    87
!FileURI methodsFor:'stream access'!
7ed6fa7ccfba initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    88
7ed6fa7ccfba initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    89
readStream
7ed6fa7ccfba initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    90
7ed6fa7ccfba initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    91
    ^ self asFilename readStream
7ed6fa7ccfba initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    92
7ed6fa7ccfba initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    93
    "
7ed6fa7ccfba initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    94
     'file:/etc/group' asURI readStream contents
1268
48b43aebf125 Fix for home directories
Stefan Vogel <sv@exept.de>
parents: 1267
diff changeset
    95
     'file:/~/.profile' asURI readStream contents
48b43aebf125 Fix for home directories
Stefan Vogel <sv@exept.de>
parents: 1267
diff changeset
    96
     (URI fromString:'file:~/.profile') asFilename
48b43aebf125 Fix for home directories
Stefan Vogel <sv@exept.de>
parents: 1267
diff changeset
    97
     (URI fromString:'file:~/.profile') readStream upToEnd
1005
7ed6fa7ccfba initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    98
    "
7ed6fa7ccfba initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    99
!
7ed6fa7ccfba initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   100
7ed6fa7ccfba initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   101
readStreamDo:aBlock
7ed6fa7ccfba initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   102
    "evaluate a block with the read stream as first argument
7ed6fa7ccfba initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   103
     and a dictionary containing attributes as second argument.
7ed6fa7ccfba initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   104
     The stream is closed after aBlock has been evaluated."
7ed6fa7ccfba initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   105
1254
baf01931b9d6 *** empty log message ***
tm
parents: 1005
diff changeset
   106
    |attributes file stream|
1005
7ed6fa7ccfba initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   107
1254
baf01931b9d6 *** empty log message ***
tm
parents: 1005
diff changeset
   108
    attributes := self class attributes.
baf01931b9d6 *** empty log message ***
tm
parents: 1005
diff changeset
   109
    file := self asFilename.
baf01931b9d6 *** empty log message ***
tm
parents: 1005
diff changeset
   110
    attributes at:#fileSize put:(file fileSize).
baf01931b9d6 *** empty log message ***
tm
parents: 1005
diff changeset
   111
    attributes at:#baseName put:file baseName.  
baf01931b9d6 *** empty log message ***
tm
parents: 1005
diff changeset
   112
    attributes at:#uriInfo  put:self printString.  
1005
7ed6fa7ccfba initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   113
1254
baf01931b9d6 *** empty log message ***
tm
parents: 1005
diff changeset
   114
    ^ [ 
baf01931b9d6 *** empty log message ***
tm
parents: 1005
diff changeset
   115
        stream := file readStream.
1005
7ed6fa7ccfba initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   116
        aBlock value:stream value:attributes
7ed6fa7ccfba initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   117
     ] ensure:[
7ed6fa7ccfba initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   118
        stream notNil ifTrue:[stream close]
7ed6fa7ccfba initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   119
     ].
7ed6fa7ccfba initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   120
7ed6fa7ccfba initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   121
    "
7ed6fa7ccfba initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   122
     'file:/etc/group' asURI readStreamDo:[:stream :attributes|
7ed6fa7ccfba initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   123
        stream contents         
7ed6fa7ccfba initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   124
                addFirst:attributes printString; 
7ed6fa7ccfba initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   125
                yourself
7ed6fa7ccfba initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   126
     ].
7ed6fa7ccfba initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   127
    "
7ed6fa7ccfba initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   128
!
7ed6fa7ccfba initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   129
1254
baf01931b9d6 *** empty log message ***
tm
parents: 1005
diff changeset
   130
readStreamsDo:aBlock
baf01931b9d6 *** empty log message ***
tm
parents: 1005
diff changeset
   131
    "evaluate the block with a Collection of streams as first argument
baf01931b9d6 *** empty log message ***
tm
parents: 1005
diff changeset
   132
     and a dictionary containing attributes as second argument,
baf01931b9d6 *** empty log message ***
tm
parents: 1005
diff changeset
   133
     - a collection with a stream on a single file,
baf01931b9d6 *** empty log message ***
tm
parents: 1005
diff changeset
   134
     - or a collection with streams on a directorie's files, but not recursive"
baf01931b9d6 *** empty log message ***
tm
parents: 1005
diff changeset
   135
1271
ca2e206e7c7f Working version: tilde-expansion, patterns
Stefan Vogel <sv@exept.de>
parents: 1268
diff changeset
   136
    self readStreamsDo:aBlock renameBlock:nil.
1258
a0eda4db4dad fileTransfer
tm
parents: 1254
diff changeset
   137
!
a0eda4db4dad fileTransfer
tm
parents: 1254
diff changeset
   138
1271
ca2e206e7c7f Working version: tilde-expansion, patterns
Stefan Vogel <sv@exept.de>
parents: 1268
diff changeset
   139
readStreamsDo:aBlock renameBlock:renameBlock
1258
a0eda4db4dad fileTransfer
tm
parents: 1254
diff changeset
   140
    "evaluate the block with a Collection of streams as first argument
a0eda4db4dad fileTransfer
tm
parents: 1254
diff changeset
   141
     and a dictionary containing attributes as second argument,
a0eda4db4dad fileTransfer
tm
parents: 1254
diff changeset
   142
     - a collection with a stream on a single file,
1271
ca2e206e7c7f Working version: tilde-expansion, patterns
Stefan Vogel <sv@exept.de>
parents: 1268
diff changeset
   143
     - or a collection with streams on a directories files, but not recursive"
1258
a0eda4db4dad fileTransfer
tm
parents: 1254
diff changeset
   144
1271
ca2e206e7c7f Working version: tilde-expansion, patterns
Stefan Vogel <sv@exept.de>
parents: 1268
diff changeset
   145
    |attributes fn files list baseName|
1254
baf01931b9d6 *** empty log message ***
tm
parents: 1005
diff changeset
   146
1271
ca2e206e7c7f Working version: tilde-expansion, patterns
Stefan Vogel <sv@exept.de>
parents: 1268
diff changeset
   147
    fn := self asFilename.
1254
baf01931b9d6 *** empty log message ***
tm
parents: 1005
diff changeset
   148
    files := OrderedCollection new.
1264
650132956801 allow '*' and '*.' in path
tm
parents: 1258
diff changeset
   149
    list := OrderedCollection new.
1254
baf01931b9d6 *** empty log message ***
tm
parents: 1005
diff changeset
   150
    attributes := self class attributes.
1264
650132956801 allow '*' and '*.' in path
tm
parents: 1258
diff changeset
   151
1254
baf01931b9d6 *** empty log message ***
tm
parents: 1005
diff changeset
   152
    fn isDirectory ifTrue:[
baf01931b9d6 *** empty log message ***
tm
parents: 1005
diff changeset
   153
        attributes at:#requestDirectory put:true.
1271
ca2e206e7c7f Working version: tilde-expansion, patterns
Stefan Vogel <sv@exept.de>
parents: 1268
diff changeset
   154
        fn directoryContentsAsFilenamesDo:[:eachFilename|
ca2e206e7c7f Working version: tilde-expansion, patterns
Stefan Vogel <sv@exept.de>
parents: 1268
diff changeset
   155
            eachFilename isDirectory ifFalse:[
ca2e206e7c7f Working version: tilde-expansion, patterns
Stefan Vogel <sv@exept.de>
parents: 1268
diff changeset
   156
                files add:eachFilename
ca2e206e7c7f Working version: tilde-expansion, patterns
Stefan Vogel <sv@exept.de>
parents: 1268
diff changeset
   157
            ].
1254
baf01931b9d6 *** empty log message ***
tm
parents: 1005
diff changeset
   158
        ].
baf01931b9d6 *** empty log message ***
tm
parents: 1005
diff changeset
   159
    ] ifFalse:[
1271
ca2e206e7c7f Working version: tilde-expansion, patterns
Stefan Vogel <sv@exept.de>
parents: 1268
diff changeset
   160
        baseName := fn baseName.
ca2e206e7c7f Working version: tilde-expansion, patterns
Stefan Vogel <sv@exept.de>
parents: 1268
diff changeset
   161
        (baseName includesAny:'*?[]') ifTrue:[ |directoryName|
1264
650132956801 allow '*' and '*.' in path
tm
parents: 1258
diff changeset
   162
            attributes at:#requestDirectory put:true.
1271
ca2e206e7c7f Working version: tilde-expansion, patterns
Stefan Vogel <sv@exept.de>
parents: 1268
diff changeset
   163
            directoryName := fn directory.
ca2e206e7c7f Working version: tilde-expansion, patterns
Stefan Vogel <sv@exept.de>
parents: 1268
diff changeset
   164
            directoryName directoryContentsDo:[:eachFilenameString|
ca2e206e7c7f Working version: tilde-expansion, patterns
Stefan Vogel <sv@exept.de>
parents: 1268
diff changeset
   165
                (baseName match:eachFilenameString) ifTrue:[ |filename|
ca2e206e7c7f Working version: tilde-expansion, patterns
Stefan Vogel <sv@exept.de>
parents: 1268
diff changeset
   166
                    filename := directoryName construct:eachFilenameString.
ca2e206e7c7f Working version: tilde-expansion, patterns
Stefan Vogel <sv@exept.de>
parents: 1268
diff changeset
   167
                    filename isDirectory ifFalse:[
ca2e206e7c7f Working version: tilde-expansion, patterns
Stefan Vogel <sv@exept.de>
parents: 1268
diff changeset
   168
                        files add:(directoryName construct:eachFilenameString).
ca2e206e7c7f Working version: tilde-expansion, patterns
Stefan Vogel <sv@exept.de>
parents: 1268
diff changeset
   169
                    ].
ca2e206e7c7f Working version: tilde-expansion, patterns
Stefan Vogel <sv@exept.de>
parents: 1268
diff changeset
   170
                ].
1264
650132956801 allow '*' and '*.' in path
tm
parents: 1258
diff changeset
   171
            ].
1271
ca2e206e7c7f Working version: tilde-expansion, patterns
Stefan Vogel <sv@exept.de>
parents: 1268
diff changeset
   172
        ] ifFalse:[
ca2e206e7c7f Working version: tilde-expansion, patterns
Stefan Vogel <sv@exept.de>
parents: 1268
diff changeset
   173
            attributes at:#requestDirectory put:false.
ca2e206e7c7f Working version: tilde-expansion, patterns
Stefan Vogel <sv@exept.de>
parents: 1268
diff changeset
   174
            files add:fn.
1264
650132956801 allow '*' and '*.' in path
tm
parents: 1258
diff changeset
   175
        ].
650132956801 allow '*' and '*.' in path
tm
parents: 1258
diff changeset
   176
    ].
650132956801 allow '*' and '*.' in path
tm
parents: 1258
diff changeset
   177
1271
ca2e206e7c7f Working version: tilde-expansion, patterns
Stefan Vogel <sv@exept.de>
parents: 1268
diff changeset
   178
    files do:[:eachFilename| |baseName stream|
1254
baf01931b9d6 *** empty log message ***
tm
parents: 1005
diff changeset
   179
        [
1271
ca2e206e7c7f Working version: tilde-expansion, patterns
Stefan Vogel <sv@exept.de>
parents: 1268
diff changeset
   180
            baseName := eachFilename baseName.
ca2e206e7c7f Working version: tilde-expansion, patterns
Stefan Vogel <sv@exept.de>
parents: 1268
diff changeset
   181
            attributes at:#fileSize put:eachFilename fileSize.
1254
baf01931b9d6 *** empty log message ***
tm
parents: 1005
diff changeset
   182
            attributes at:#baseName put:baseName.  
1271
ca2e206e7c7f Working version: tilde-expansion, patterns
Stefan Vogel <sv@exept.de>
parents: 1268
diff changeset
   183
            (self pathSegments includes:baseName) ifTrue:[
1258
a0eda4db4dad fileTransfer
tm
parents: 1254
diff changeset
   184
                attributes at:#uriInfo put:self.  
1266
4522fd38deef *** empty log message ***
tm
parents: 1264
diff changeset
   185
            ] ifFalse:[ |uri col|
4522fd38deef *** empty log message ***
tm
parents: 1264
diff changeset
   186
                uri := self copy.
1271
ca2e206e7c7f Working version: tilde-expansion, patterns
Stefan Vogel <sv@exept.de>
parents: 1268
diff changeset
   187
                col := self pathSegments copy.
1266
4522fd38deef *** empty log message ***
tm
parents: 1264
diff changeset
   188
                col removeLast.
4522fd38deef *** empty log message ***
tm
parents: 1264
diff changeset
   189
                col add:baseName.
1271
ca2e206e7c7f Working version: tilde-expansion, patterns
Stefan Vogel <sv@exept.de>
parents: 1268
diff changeset
   190
                uri pathSegments:col.
1266
4522fd38deef *** empty log message ***
tm
parents: 1264
diff changeset
   191
                attributes at:#uriInfo put:uri.  
1254
baf01931b9d6 *** empty log message ***
tm
parents: 1005
diff changeset
   192
            ].
1271
ca2e206e7c7f Working version: tilde-expansion, patterns
Stefan Vogel <sv@exept.de>
parents: 1268
diff changeset
   193
            stream := eachFilename readStream.
1258
a0eda4db4dad fileTransfer
tm
parents: 1254
diff changeset
   194
            aBlock value:stream value:attributes.
1254
baf01931b9d6 *** empty log message ***
tm
parents: 1005
diff changeset
   195
        ] ensure:[
baf01931b9d6 *** empty log message ***
tm
parents: 1005
diff changeset
   196
            stream notNil ifTrue:[stream close]
baf01931b9d6 *** empty log message ***
tm
parents: 1005
diff changeset
   197
        ].
1271
ca2e206e7c7f Working version: tilde-expansion, patterns
Stefan Vogel <sv@exept.de>
parents: 1268
diff changeset
   198
ca2e206e7c7f Working version: tilde-expansion, patterns
Stefan Vogel <sv@exept.de>
parents: 1268
diff changeset
   199
        renameBlock notNil ifTrue:[ |renameFilenameString|
ca2e206e7c7f Working version: tilde-expansion, patterns
Stefan Vogel <sv@exept.de>
parents: 1268
diff changeset
   200
            renameFilenameString := renameBlock value:eachFilename pathName.
ca2e206e7c7f Working version: tilde-expansion, patterns
Stefan Vogel <sv@exept.de>
parents: 1268
diff changeset
   201
            renameFilenameString asFilename exists ifTrue:[
ca2e206e7c7f Working version: tilde-expansion, patterns
Stefan Vogel <sv@exept.de>
parents: 1268
diff changeset
   202
                renameFilenameString := renameFilenameString, '.', 
ca2e206e7c7f Working version: tilde-expansion, patterns
Stefan Vogel <sv@exept.de>
parents: 1268
diff changeset
   203
                        (AbsoluteTime now printStringFormat:'%(year)%(mon)%(day)%h%m%s').
ca2e206e7c7f Working version: tilde-expansion, patterns
Stefan Vogel <sv@exept.de>
parents: 1268
diff changeset
   204
            ].
ca2e206e7c7f Working version: tilde-expansion, patterns
Stefan Vogel <sv@exept.de>
parents: 1268
diff changeset
   205
            eachFilename moveTo:renameFilenameString.
1258
a0eda4db4dad fileTransfer
tm
parents: 1254
diff changeset
   206
        ].
1254
baf01931b9d6 *** empty log message ***
tm
parents: 1005
diff changeset
   207
    ].
baf01931b9d6 *** empty log message ***
tm
parents: 1005
diff changeset
   208
baf01931b9d6 *** empty log message ***
tm
parents: 1005
diff changeset
   209
    "
1271
ca2e206e7c7f Working version: tilde-expansion, patterns
Stefan Vogel <sv@exept.de>
parents: 1268
diff changeset
   210
        (URI fromString:'file:~/test/out') 
ca2e206e7c7f Working version: tilde-expansion, patterns
Stefan Vogel <sv@exept.de>
parents: 1268
diff changeset
   211
            readStreamsDo:[:stream :attributes | 
ca2e206e7c7f Working version: tilde-expansion, patterns
Stefan Vogel <sv@exept.de>
parents: 1268
diff changeset
   212
                Transcript showCR:(attributes at:#baseName).
ca2e206e7c7f Working version: tilde-expansion, patterns
Stefan Vogel <sv@exept.de>
parents: 1268
diff changeset
   213
                Transcript showCR:(attributes at:#fileSize).
ca2e206e7c7f Working version: tilde-expansion, patterns
Stefan Vogel <sv@exept.de>
parents: 1268
diff changeset
   214
                Transcript showCR:(attributes at:#requestDirectory).
ca2e206e7c7f Working version: tilde-expansion, patterns
Stefan Vogel <sv@exept.de>
parents: 1268
diff changeset
   215
                Transcript showCR:(attributes at:#uriInfo).
ca2e206e7c7f Working version: tilde-expansion, patterns
Stefan Vogel <sv@exept.de>
parents: 1268
diff changeset
   216
            ].
ca2e206e7c7f Working version: tilde-expansion, patterns
Stefan Vogel <sv@exept.de>
parents: 1268
diff changeset
   217
        (URI fromString:'file:~/test/out/*1') 
1254
baf01931b9d6 *** empty log message ***
tm
parents: 1005
diff changeset
   218
            readStreamsDo:[:stream :attributes | 
baf01931b9d6 *** empty log message ***
tm
parents: 1005
diff changeset
   219
                Transcript showCR:(attributes at:#baseName).
baf01931b9d6 *** empty log message ***
tm
parents: 1005
diff changeset
   220
                Transcript showCR:(attributes at:#fileSize).
baf01931b9d6 *** empty log message ***
tm
parents: 1005
diff changeset
   221
                Transcript showCR:(attributes at:#requestDirectory).
baf01931b9d6 *** empty log message ***
tm
parents: 1005
diff changeset
   222
                Transcript showCR:(attributes at:#uriInfo).
baf01931b9d6 *** empty log message ***
tm
parents: 1005
diff changeset
   223
            ].
baf01931b9d6 *** empty log message ***
tm
parents: 1005
diff changeset
   224
    "
baf01931b9d6 *** empty log message ***
tm
parents: 1005
diff changeset
   225
!
baf01931b9d6 *** empty log message ***
tm
parents: 1005
diff changeset
   226
baf01931b9d6 *** empty log message ***
tm
parents: 1005
diff changeset
   227
writeStreamDo:aBlock
baf01931b9d6 *** empty log message ***
tm
parents: 1005
diff changeset
   228
    "evaluate a block with the write stream as first argument
baf01931b9d6 *** empty log message ***
tm
parents: 1005
diff changeset
   229
     and a dictionary containing attributes as second argument.
baf01931b9d6 *** empty log message ***
tm
parents: 1005
diff changeset
   230
     The stream is closed after aBlock has been evaluated.
baf01931b9d6 *** empty log message ***
tm
parents: 1005
diff changeset
   231
     Attributes may be the mime type (key #MIME)"
baf01931b9d6 *** empty log message ***
tm
parents: 1005
diff changeset
   232
baf01931b9d6 *** empty log message ***
tm
parents: 1005
diff changeset
   233
    |stream|
baf01931b9d6 *** empty log message ***
tm
parents: 1005
diff changeset
   234
baf01931b9d6 *** empty log message ***
tm
parents: 1005
diff changeset
   235
    ^ [
baf01931b9d6 *** empty log message ***
tm
parents: 1005
diff changeset
   236
        stream := self asFilename writeStream.
baf01931b9d6 *** empty log message ***
tm
parents: 1005
diff changeset
   237
        aBlock value:stream value:self class attributes
baf01931b9d6 *** empty log message ***
tm
parents: 1005
diff changeset
   238
     ] ensure:[
baf01931b9d6 *** empty log message ***
tm
parents: 1005
diff changeset
   239
        stream notNil ifTrue:[stream close]
baf01931b9d6 *** empty log message ***
tm
parents: 1005
diff changeset
   240
     ].
baf01931b9d6 *** empty log message ***
tm
parents: 1005
diff changeset
   241
baf01931b9d6 *** empty log message ***
tm
parents: 1005
diff changeset
   242
    "
baf01931b9d6 *** empty log message ***
tm
parents: 1005
diff changeset
   243
        (URI fromString:'file:/home/tm/tmp') 
baf01931b9d6 *** empty log message ***
tm
parents: 1005
diff changeset
   244
            readStreamsDo:[:stream :attributes| 
baf01931b9d6 *** empty log message ***
tm
parents: 1005
diff changeset
   245
                Transcript showCR:(attributes at:#MIME).
baf01931b9d6 *** empty log message ***
tm
parents: 1005
diff changeset
   246
                Transcript showCR:(stream isWritable).
baf01931b9d6 *** empty log message ***
tm
parents: 1005
diff changeset
   247
            ].
baf01931b9d6 *** empty log message ***
tm
parents: 1005
diff changeset
   248
    "
1258
a0eda4db4dad fileTransfer
tm
parents: 1254
diff changeset
   249
!
a0eda4db4dad fileTransfer
tm
parents: 1254
diff changeset
   250
a0eda4db4dad fileTransfer
tm
parents: 1254
diff changeset
   251
writeStreamDo:aBlock create:doCreate
1268
48b43aebf125 Fix for home directories
Stefan Vogel <sv@exept.de>
parents: 1267
diff changeset
   252
48b43aebf125 Fix for home directories
Stefan Vogel <sv@exept.de>
parents: 1267
diff changeset
   253
    ^ self writeStreamDo:aBlock create:doCreate atomic:false.
48b43aebf125 Fix for home directories
Stefan Vogel <sv@exept.de>
parents: 1267
diff changeset
   254
!
48b43aebf125 Fix for home directories
Stefan Vogel <sv@exept.de>
parents: 1267
diff changeset
   255
48b43aebf125 Fix for home directories
Stefan Vogel <sv@exept.de>
parents: 1267
diff changeset
   256
writeStreamDo:aBlock create:doCreate atomic:doAtomic
1258
a0eda4db4dad fileTransfer
tm
parents: 1254
diff changeset
   257
    "evaluate a block with the write stream as first argument
a0eda4db4dad fileTransfer
tm
parents: 1254
diff changeset
   258
     and a dictionary containing attributes as second argument.
a0eda4db4dad fileTransfer
tm
parents: 1254
diff changeset
   259
     The stream is closed after aBlock has been evaluated.
1268
48b43aebf125 Fix for home directories
Stefan Vogel <sv@exept.de>
parents: 1267
diff changeset
   260
     Attributes may be the mime type (key #MIME)
48b43aebf125 Fix for home directories
Stefan Vogel <sv@exept.de>
parents: 1267
diff changeset
   261
48b43aebf125 Fix for home directories
Stefan Vogel <sv@exept.de>
parents: 1267
diff changeset
   262
     If doCreate is true, a nonExistent directory will be created.
48b43aebf125 Fix for home directories
Stefan Vogel <sv@exept.de>
parents: 1267
diff changeset
   263
     If doAtomic is true, files will appear atomically, by using
48b43aebf125 Fix for home directories
Stefan Vogel <sv@exept.de>
parents: 1267
diff changeset
   264
        an intermediate file theat will be renamed"
1258
a0eda4db4dad fileTransfer
tm
parents: 1254
diff changeset
   265
1268
48b43aebf125 Fix for home directories
Stefan Vogel <sv@exept.de>
parents: 1267
diff changeset
   266
    |stream fileName toFileName|
1258
a0eda4db4dad fileTransfer
tm
parents: 1254
diff changeset
   267
1268
48b43aebf125 Fix for home directories
Stefan Vogel <sv@exept.de>
parents: 1267
diff changeset
   268
    fileName := self asFilename.
1271
ca2e206e7c7f Working version: tilde-expansion, patterns
Stefan Vogel <sv@exept.de>
parents: 1268
diff changeset
   269
    toFileName := fileName.
1268
48b43aebf125 Fix for home directories
Stefan Vogel <sv@exept.de>
parents: 1267
diff changeset
   270
    doAtomic ifTrue:[
1271
ca2e206e7c7f Working version: tilde-expansion, patterns
Stefan Vogel <sv@exept.de>
parents: 1268
diff changeset
   271
        fileName isDirectory ifFalse:[
ca2e206e7c7f Working version: tilde-expansion, patterns
Stefan Vogel <sv@exept.de>
parents: 1268
diff changeset
   272
            toFileName := fileName directory.
ca2e206e7c7f Working version: tilde-expansion, patterns
Stefan Vogel <sv@exept.de>
parents: 1268
diff changeset
   273
        ].
ca2e206e7c7f Working version: tilde-expansion, patterns
Stefan Vogel <sv@exept.de>
parents: 1268
diff changeset
   274
        toFileName := toFileName construct:'.transferFile'.
1268
48b43aebf125 Fix for home directories
Stefan Vogel <sv@exept.de>
parents: 1267
diff changeset
   275
    ].
1258
a0eda4db4dad fileTransfer
tm
parents: 1254
diff changeset
   276
    [
a0eda4db4dad fileTransfer
tm
parents: 1254
diff changeset
   277
        Stream streamErrorSignal handle:[:ex|
a0eda4db4dad fileTransfer
tm
parents: 1254
diff changeset
   278
            doCreate ifFalse:[
a0eda4db4dad fileTransfer
tm
parents: 1254
diff changeset
   279
                ex reject
a0eda4db4dad fileTransfer
tm
parents: 1254
diff changeset
   280
            ].    
1268
48b43aebf125 Fix for home directories
Stefan Vogel <sv@exept.de>
parents: 1267
diff changeset
   281
            fileName directory recursiveMakeDirectory.
1284
57550436b55b file exists error handling
tm
parents: 1271
diff changeset
   282
            self exists ifTrue:[ |infoStream|
57550436b55b file exists error handling
tm
parents: 1271
diff changeset
   283
                infoStream := '' writeStream.
57550436b55b file exists error handling
tm
parents: 1271
diff changeset
   284
                self publicPrintOn:infoStream.
57550436b55b file exists error handling
tm
parents: 1271
diff changeset
   285
                self error:('Local write: Datei %1 already exists!!' bindWith:infoStream contents).
57550436b55b file exists error handling
tm
parents: 1271
diff changeset
   286
            ].
1268
48b43aebf125 Fix for home directories
Stefan Vogel <sv@exept.de>
parents: 1267
diff changeset
   287
            stream := toFileName writeStream.
1258
a0eda4db4dad fileTransfer
tm
parents: 1254
diff changeset
   288
        ] do:[
1284
57550436b55b file exists error handling
tm
parents: 1271
diff changeset
   289
            self exists ifTrue:[ |infoStream|
57550436b55b file exists error handling
tm
parents: 1271
diff changeset
   290
                infoStream := '' writeStream.
57550436b55b file exists error handling
tm
parents: 1271
diff changeset
   291
                self publicPrintOn:infoStream.
57550436b55b file exists error handling
tm
parents: 1271
diff changeset
   292
                self error:('Local write: Datei %1 already exists!!' bindWith:infoStream contents).
57550436b55b file exists error handling
tm
parents: 1271
diff changeset
   293
            ].
1268
48b43aebf125 Fix for home directories
Stefan Vogel <sv@exept.de>
parents: 1267
diff changeset
   294
            stream := toFileName writeStream.
1258
a0eda4db4dad fileTransfer
tm
parents: 1254
diff changeset
   295
        ].
1268
48b43aebf125 Fix for home directories
Stefan Vogel <sv@exept.de>
parents: 1267
diff changeset
   296
        aBlock value:stream value:self class attributes.
1271
ca2e206e7c7f Working version: tilde-expansion, patterns
Stefan Vogel <sv@exept.de>
parents: 1268
diff changeset
   297
        stream close.
1268
48b43aebf125 Fix for home directories
Stefan Vogel <sv@exept.de>
parents: 1267
diff changeset
   298
        doAtomic ifTrue:[
48b43aebf125 Fix for home directories
Stefan Vogel <sv@exept.de>
parents: 1267
diff changeset
   299
            toFileName moveTo:fileName.
48b43aebf125 Fix for home directories
Stefan Vogel <sv@exept.de>
parents: 1267
diff changeset
   300
        ]
1271
ca2e206e7c7f Working version: tilde-expansion, patterns
Stefan Vogel <sv@exept.de>
parents: 1268
diff changeset
   301
    ] ifCurtailed:[
1258
a0eda4db4dad fileTransfer
tm
parents: 1254
diff changeset
   302
        stream notNil ifTrue:[stream close]
a0eda4db4dad fileTransfer
tm
parents: 1254
diff changeset
   303
    ].
a0eda4db4dad fileTransfer
tm
parents: 1254
diff changeset
   304
a0eda4db4dad fileTransfer
tm
parents: 1254
diff changeset
   305
    "
a0eda4db4dad fileTransfer
tm
parents: 1254
diff changeset
   306
        (URI fromString:'file:/home/tm/tmp') 
a0eda4db4dad fileTransfer
tm
parents: 1254
diff changeset
   307
            readStreamsDo:[:stream :attributes| 
a0eda4db4dad fileTransfer
tm
parents: 1254
diff changeset
   308
                Transcript showCR:(attributes at:#MIME).
a0eda4db4dad fileTransfer
tm
parents: 1254
diff changeset
   309
                Transcript showCR:(stream isWritable).
a0eda4db4dad fileTransfer
tm
parents: 1254
diff changeset
   310
            ].
a0eda4db4dad fileTransfer
tm
parents: 1254
diff changeset
   311
    "
1005
7ed6fa7ccfba initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   312
! !
7ed6fa7ccfba initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   313
7ed6fa7ccfba initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   314
!FileURI class methodsFor:'documentation'!
7ed6fa7ccfba initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   315
7ed6fa7ccfba initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   316
version
1284
57550436b55b file exists error handling
tm
parents: 1271
diff changeset
   317
    ^ '$Header: /cvs/stx/stx/libbasic2/FileURI.st,v 1.9 2003-07-24 09:29:43 tm Exp $'
1005
7ed6fa7ccfba initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   318
! !