Post nato da discussione su forum. Supponiamo di voler creare un client ftp (applicazione Windows Form) per il download/upload di file, utilizzando un controllo ProgressBar per visualizzare lo stato di avanzamento dell'operazione. Grazie alle classi messe a disposizione del Framework .Net, il codice per il download di un file remoto, potrebbe essere del tipo:
1 //Connessione con l'host
2 Connect(remotePathFile);
3
4 //Imposta il tipo di richiesta
5 _conn.Method = WebRequestMethods.Ftp.DownloadFile;
6
7 //Ottiene la risposta
8 _resp = (FtpWebResponse)(_conn.GetResponse());
9 System.IO.Stream _respStream = _resp.GetResponseStream();
10
11 if (ContinueProcess(_resp.StatusDescription))
12 {
13 //Apre il file locale per la scrittura
14 //....
15
16 try
17 {
18 //Recupera la dimensione del file come numero di bytes
19 Int64 totalBytes = GetFileSize(remotePathFile);
20 Int64 totalBytesRead = 0;
21
22 if (downloadFileStarted != null) downloadFileStarted(totalBytes);
23
24 byte[] buf = new byte[1024];
25
26 int bytesRead = _respStream.Read(buf, 0, buf.Length);
27
28 while (bytesRead != 0)
29 {
30 totalBytesRead += bytesRead;
31
32 if (downloadFileProgress != null) downloadFileProgress(totalBytes, totalBytesRead);
33
34 fileStream.Write(buf, 0, bytesRead);
35
36 bytesRead = _respStream.Read(buf, 0, buf.Length);
37 }
38
39 if (downloadFileCompleted != null) downloadFileCompleted();
40
41 return true;
42 }
43 catch (WebException ex)
44 {
45 //.....
46 }
47 finally
48 {
49 fileStream.Close();
50 _respStream.Close();
51 }
52 }
53 else ...
54 }
mentre il codice per eseguire l'upload, potrebbe essere del tipo:
1 if (Connect(remoteFilePath))
2 {
3 try
4 {
5 //Connected
6 _conn.Method = WebRequestMethods.Ftp.UploadFile;
7
8 FileInfo file = new FileInfo(localFilePath);
9
10 if (file.Length > 0)
11 {
12 if (uploadFileStarted != null) uploadFileStarted(file.Length);
13
14 Stream strUpload = _conn.GetRequestStream();
15
16 int bytesRead = 0;
17 int totalBytesRead = 0;
18 byte[] fileBytes = new byte[1024];
19
20 FileStream strLocalFile = new FileStream(localFilePath, FileMode.Open);
21 bytesRead = strLocalFile.Read(fileBytes, 0, fileBytes.Length);
22
23 while (bytesRead != 0)
24 {
25 totalBytesRead += bytesRead;
26
27 strUpload.Write(fileBytes, 0, bytesRead);
28
29 if (uploadFileProgress != null) uploadFileProgress(file.Length, totalBytesRead);
30
31 bytesRead = strLocalFile.Read(fileBytes, 0, fileBytes.Length);
32 }
33
34 strLocalFile.Close();
35 strUpload.Close();
36
37 if (uploadFileCompleted != null) uploadFileCompleted();
38 }
39 }
40 catch (WebException ex) {...}
41 catch (Exception ex) { ...}
42 }
43 else{...}
Nulla di particolare, tranne che, sia per l'upload che per il download, il file viene inviato/scaricato un blocco per volta, nell'esempio di dimensione massima di 1024 Byte.
In allegato, un'applicazione Windows Form molto semplice.
Le operazioni di download/upload sono eseguite su un thread diverso da quello principale.
Codice allegato