1
+ using System ;
2
+ using System . Collections . Generic ;
3
+ using System . IO ;
4
+ using System . Net ;
5
+
6
+
7
+ namespace RevStack . Net
8
+ {
9
+ public class Ftp
10
+ {
11
+ public bool Binary = true ;
12
+ public bool EnableSsl = false ;
13
+ public bool Hash = false ;
14
+ public bool Passive = true ;
15
+ private string uri ;
16
+ private readonly int bufferSize = 1024 ;
17
+ private readonly string password ;
18
+ private readonly string userName ;
19
+
20
+ public Ftp ( string uri , string userName , string password )
21
+ {
22
+ this . uri = uri ;
23
+ this . userName = userName ;
24
+ this . password = password ;
25
+ }
26
+
27
+ public string AppendFile ( string source , string destination )
28
+ {
29
+ var request = createRequest ( combine ( uri , destination ) , WebRequestMethods . Ftp . AppendFile ) ;
30
+
31
+ using ( var stream = request . GetRequestStream ( ) )
32
+ {
33
+ using ( var fileStream = File . Open ( source , FileMode . Open ) )
34
+ {
35
+ int num ;
36
+
37
+ var buffer = new byte [ bufferSize ] ;
38
+
39
+ while ( ( num = fileStream . Read ( buffer , 0 , buffer . Length ) ) > 0 )
40
+ {
41
+ if ( Hash )
42
+ Console . Write ( "#" ) ;
43
+
44
+ stream . Write ( buffer , 0 , num ) ;
45
+ }
46
+ }
47
+ }
48
+
49
+ return getStatusDescription ( request ) ;
50
+ }
51
+
52
+ public string ChangeWorkingDirectory ( string path )
53
+ {
54
+ uri = combine ( uri , path ) ;
55
+
56
+ return PrintWorkingDirectory ( ) ;
57
+ }
58
+
59
+ public string DeleteFile ( string fileName )
60
+ {
61
+ var request = createRequest ( combine ( uri , fileName ) , WebRequestMethods . Ftp . DeleteFile ) ;
62
+
63
+ return getStatusDescription ( request ) ;
64
+ }
65
+
66
+ public string DownloadFile ( string source , string dest )
67
+ {
68
+ var request = createRequest ( combine ( uri , source ) , WebRequestMethods . Ftp . DownloadFile ) ;
69
+
70
+ var buffer = new byte [ bufferSize ] ;
71
+
72
+ using ( var response = ( FtpWebResponse ) request . GetResponse ( ) )
73
+ {
74
+ using ( var stream = response . GetResponseStream ( ) )
75
+ {
76
+ using ( var fs = new FileStream ( dest , FileMode . OpenOrCreate ) )
77
+ {
78
+ var readCount = stream . Read ( buffer , 0 , bufferSize ) ;
79
+
80
+ while ( readCount > 0 )
81
+ {
82
+ if ( Hash )
83
+ Console . Write ( "#" ) ;
84
+
85
+ fs . Write ( buffer , 0 , readCount ) ;
86
+ readCount = stream . Read ( buffer , 0 , bufferSize ) ;
87
+ }
88
+ }
89
+ }
90
+
91
+ return response . StatusDescription ;
92
+ }
93
+ }
94
+
95
+ public Stream DownloadFileStream ( string source )
96
+ {
97
+ var request = createRequest ( combine ( uri , source ) , WebRequestMethods . Ftp . DownloadFile ) ;
98
+ var response = ( FtpWebResponse ) request . GetResponse ( ) ;
99
+ var stream = response . GetResponseStream ( ) ;
100
+
101
+ return stream ;
102
+ }
103
+
104
+ public DateTime GetDateTimestamp ( string fileName )
105
+ {
106
+ var request = createRequest ( combine ( uri , fileName ) , WebRequestMethods . Ftp . GetDateTimestamp ) ;
107
+
108
+ using ( var response = ( FtpWebResponse ) request . GetResponse ( ) )
109
+ {
110
+ return response . LastModified ;
111
+ }
112
+ }
113
+
114
+ public long GetFileSize ( string fileName )
115
+ {
116
+ var request = createRequest ( combine ( uri , fileName ) , WebRequestMethods . Ftp . GetFileSize ) ;
117
+
118
+ using ( var response = ( FtpWebResponse ) request . GetResponse ( ) )
119
+ {
120
+ return response . ContentLength ;
121
+ }
122
+ }
123
+
124
+ public string [ ] ListDirectory ( )
125
+ {
126
+ var list = new List < string > ( ) ;
127
+
128
+ var request = createRequest ( WebRequestMethods . Ftp . ListDirectory ) ;
129
+
130
+ using ( var response = ( FtpWebResponse ) request . GetResponse ( ) )
131
+ {
132
+ using ( var stream = response . GetResponseStream ( ) )
133
+ {
134
+ using ( var reader = new StreamReader ( stream , true ) )
135
+ {
136
+ while ( ! reader . EndOfStream )
137
+ {
138
+ list . Add ( reader . ReadLine ( ) ) ;
139
+ }
140
+ }
141
+ }
142
+ }
143
+
144
+ return list . ToArray ( ) ;
145
+ }
146
+
147
+ public string [ ] ListDirectoryDetails ( )
148
+ {
149
+ var list = new List < string > ( ) ;
150
+
151
+ var request = createRequest ( WebRequestMethods . Ftp . ListDirectoryDetails ) ;
152
+
153
+ using ( var response = ( FtpWebResponse ) request . GetResponse ( ) )
154
+ {
155
+ using ( var stream = response . GetResponseStream ( ) )
156
+ {
157
+ using ( var reader = new StreamReader ( stream , true ) )
158
+ {
159
+ while ( ! reader . EndOfStream )
160
+ {
161
+ list . Add ( reader . ReadLine ( ) ) ;
162
+ }
163
+ }
164
+ }
165
+ }
166
+
167
+ return list . ToArray ( ) ;
168
+ }
169
+
170
+ public string MakeDirectory ( string directoryName )
171
+ {
172
+ var request = createRequest ( combine ( uri , directoryName ) , WebRequestMethods . Ftp . MakeDirectory ) ;
173
+
174
+ return getStatusDescription ( request ) ;
175
+ }
176
+
177
+ public string PrintWorkingDirectory ( )
178
+ {
179
+ var request = createRequest ( WebRequestMethods . Ftp . PrintWorkingDirectory ) ;
180
+
181
+ return getStatusDescription ( request ) ;
182
+ }
183
+
184
+ public string RemoveDirectory ( string directoryName )
185
+ {
186
+ var request = createRequest ( combine ( uri , directoryName ) , WebRequestMethods . Ftp . RemoveDirectory ) ;
187
+
188
+ return getStatusDescription ( request ) ;
189
+ }
190
+
191
+ public string Rename ( string currentName , string newName )
192
+ {
193
+ var request = createRequest ( combine ( uri , currentName ) , WebRequestMethods . Ftp . Rename ) ;
194
+
195
+ request . RenameTo = newName ;
196
+
197
+ return getStatusDescription ( request ) ;
198
+ }
199
+
200
+ public string UploadFile ( string source , string destination )
201
+ {
202
+ var request = createRequest ( combine ( uri , destination ) , WebRequestMethods . Ftp . UploadFile ) ;
203
+
204
+ using ( var stream = request . GetRequestStream ( ) )
205
+ {
206
+ using ( var fileStream = File . Open ( source , FileMode . Open ) )
207
+ {
208
+ int num ;
209
+
210
+ var buffer = new byte [ bufferSize ] ;
211
+
212
+ while ( ( num = fileStream . Read ( buffer , 0 , buffer . Length ) ) > 0 )
213
+ {
214
+ if ( Hash )
215
+ Console . Write ( "#" ) ;
216
+
217
+ stream . Write ( buffer , 0 , num ) ;
218
+ }
219
+ }
220
+ }
221
+
222
+ return getStatusDescription ( request ) ;
223
+ }
224
+
225
+ public string UploadFileWithUniqueName ( string source )
226
+ {
227
+ var request = createRequest ( WebRequestMethods . Ftp . UploadFileWithUniqueName ) ;
228
+
229
+ using ( var stream = request . GetRequestStream ( ) )
230
+ {
231
+ using ( var fileStream = File . Open ( source , FileMode . Open ) )
232
+ {
233
+ int num ;
234
+
235
+ var buffer = new byte [ bufferSize ] ;
236
+
237
+ while ( ( num = fileStream . Read ( buffer , 0 , buffer . Length ) ) > 0 )
238
+ {
239
+ if ( Hash )
240
+ Console . Write ( "#" ) ;
241
+
242
+ stream . Write ( buffer , 0 , num ) ;
243
+ }
244
+ }
245
+ }
246
+
247
+ using ( var response = ( FtpWebResponse ) request . GetResponse ( ) )
248
+ {
249
+ return Path . GetFileName ( response . ResponseUri . ToString ( ) ) ;
250
+ }
251
+ }
252
+
253
+ private FtpWebRequest createRequest ( string method )
254
+ {
255
+ return createRequest ( uri , method ) ;
256
+ }
257
+
258
+ #region "private"
259
+
260
+ private FtpWebRequest createRequest ( string uri , string method )
261
+ {
262
+ var r = ( FtpWebRequest ) WebRequest . Create ( uri ) ;
263
+
264
+ r . Credentials = new NetworkCredential ( userName , password ) ;
265
+ r . Method = method ;
266
+ r . UseBinary = Binary ;
267
+ r . EnableSsl = EnableSsl ;
268
+ r . UsePassive = Passive ;
269
+
270
+ return r ;
271
+ }
272
+
273
+ private string getStatusDescription ( FtpWebRequest request )
274
+ {
275
+ using ( var response = ( FtpWebResponse ) request . GetResponse ( ) )
276
+ {
277
+ return response . StatusDescription ;
278
+ }
279
+ }
280
+
281
+ private string combine ( string path1 , string path2 )
282
+ {
283
+ return Path . Combine ( path1 , path2 ) . Replace ( "\\ " , "/" ) ;
284
+ }
285
+
286
+ #endregion
287
+ }
288
+ }
0 commit comments