Informazioni generali
Sono ancora in fase di apprendimento C#. Per aiutare me stesso, sto cercando di creare un programma che sincronizzerà automaticamente tutti i miei progetti locali con una cartella sul mio server FTP. Questo perché sia a scuola che a casa, ho sempre a disposizione gli stessi progetti.C# Scarica tutti i file e sottodirectory tramite FTP
So che ci sono programmi come Dropbox che già fanno questo per me, ma ho pensato di creare qualcosa di simile che mi insegnerà molto lungo la strada.
Il problema
Il mio primo passo verso il mio obiettivo era quello di scaricare solo tutti i file, sottodirectory e file correlati dal mio server FTP. Sono riuscito a scaricare tutti i file da una directory con il seguente codice. Tuttavia, il mio codice elenca solo i nomi delle cartelle e i file nella directory principale. Sottocartelle e sottofile non vengono mai restituite e non vengono mai scaricate. A parte questo, il server restituisce un errore 550 perché sto cercando di scaricare le cartelle come se fossero dei file. Sono stato su questo per 4+ ore, ma non riesco a trovare nulla su come risolvere questi problemi e farlo funzionare. Perciò spero che voi ragazzi mi saranno d'aiuto :)
Codice
public string[] GetFileList()
{
string[] downloadFiles;
StringBuilder result = new StringBuilder();
WebResponse response = null;
StreamReader reader = null;
try
{
FtpWebRequest request = (FtpWebRequest)WebRequest.Create(url);
request.UseBinary = true;
request.Method = WebRequestMethods.Ftp.ListDirectory;
request.Credentials = new NetworkCredential(ftpUserName, ftpPassWord);
request.KeepAlive = false;
request.UsePassive = false;
response = request.GetResponse();
reader = new StreamReader(response.GetResponseStream());
string line = reader.ReadLine();
while (line != null)
{
result.Append(line);
result.Append("\n");
line = reader.ReadLine();
}
result.Remove(result.ToString().LastIndexOf('\n'), 1);
return result.ToString().Split('\n');
}
catch (Exception ex)
{
if (reader != null)
{
reader.Close();
}
if (response != null)
{
response.Close();
}
downloadFiles = null;
return downloadFiles;
}
}
private void Download(string file)
{
try
{
string uri = url + "/" + file;
Uri serverUri = new Uri(uri);
if (serverUri.Scheme != Uri.UriSchemeFtp)
{
return;
}
FtpWebRequest request = (FtpWebRequest)WebRequest.Create(url + "/" + file);
request.UseBinary = true;
request.Method = WebRequestMethods.Ftp.DownloadFile;
request.Credentials = new NetworkCredential(ftpUserName, ftpPassWord);
request.KeepAlive = false;
request.UsePassive = false;
FtpWebResponse response = (FtpWebResponse)request.GetResponse();
Stream responseStream = response.GetResponseStream();
FileStream writeStream = new FileStream(localDestnDir + "\\" + file, FileMode.Create);
int Length = 2048;
Byte[] buffer = new Byte[Length];
int bytesRead = responseStream.Read(buffer, 0, Length);
while (bytesRead > 0)
{
writeStream.Write(buffer, 0, bytesRead);
bytesRead = responseStream.Read(buffer, 0, Length);
}
writeStream.Close();
response.Close();
}
catch (WebException wEx)
{
MessageBox.Show(wEx.Message, "Download Error");
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "Download Error");
}
}
ho cambiato la tua risposta alla risposta accettata come ho imparato molto da lui e per tutta l'Efford che hai messo in esso! Grazie ancora! – icecub
Salve, sto cercando di usare la tua libreria ma ho bisogno di SSL/TLS sulla mia connessione. Sto facendo questo tramite richiesta standard FTP usando EnableSsl = true può essere impostato nelle opzioni della sessione? – Jay
Sono stato in grado di collegarlo impostando FtpMode e FTPSecure rispettivamente a Passive ed Explicit, ottima libreria la caratteristica ricorsiva è eccellente, una domanda è una caratteristica che cattura i file che non esistono nella nuova cartella quindi essenzialmente afferrando solo il nuovo file che sono già stati copiati – Jay