2010-03-05 11 views
6

Requisito, caricare 1500 immagini jpg ogni notte, il codice seguente si apre e chiude una connessione molte volte, mi chiedo se c'è un modo migliore.Carica più file FTP

... questo è un frammento di codice, quindi non ci sono variabili qui che sono definiti altrove

Dim picClsRequest = DirectCast(System.Net.WebRequest.Create(ftpImagePath), System.Net.FtpWebRequest) 
Dim picClsStream As System.IO.Stream 

Dim picCount As Integer = 0 
For i = 1 To picPath.Count - 1 
    picCount = picCount + 1 
    log("Sending picture (" & picCount & " of " & picPath.Count & "):" & picDir & "/" & picPath(i)) 
    picClsRequest = DirectCast(System.Net.WebRequest.Create(ftpImagePath & "/" & picPath(i)), System.Net.FtpWebRequest) 
    picClsRequest.Credentials = New System.Net.NetworkCredential(ftpUsername, ftpPassword) 
    picClsRequest.Method = System.Net.WebRequestMethods.Ftp.UploadFile 
    picClsRequest.UseBinary = True 
    picClsStream = picClsRequest.GetRequestStream() 

    bFile = System.IO.File.ReadAllBytes(picDir & "/" & picPath(i)) 
    picClsStream.Write(bFile, 0, bFile.Length) 
    picClsStream.Close() 

Next 

Alcuni commenti:

Sì, lo so picCount è ridondante ... Era tarda notte.

ftpImagePath, picDir, ftpUsername, ftpPassword sono tutte variabili

Sì, questo è in chiaro

Questo codice funziona bene, sto cercando di ottimizzare

questione connessa: FTP Upload multiple files without disconnect using .NET

+0

Nota: Il problema che ho con questo codice è che mantiene l'apertura di una nuova connessione FTP. È aperto e chiuso 1500 volte ogni volta che viene eseguita questa app. – Markus

risposta

5

Si può dare un'occhiata all'invio dei file in modo asincrono se si desidera inviare più di un file alla volta (se l'ordine non è importante). Date un'occhiata alle varie Begin * e metodi End * come ad esempio FtpWebRequest.BeginGetResponse e FtpWebRequest.EndGetResponse ecc

Inoltre si poteva guardare nella proprietà FtpWebRequest.KeepAlive, che viene utilizzato per mantenere una connessione aperta/memorizzati nella cache per il riutilizzo.

Hmmm, si potrebbe anche provare la creazione di un file tar gigante e inviare il singolo file in un unico flusso con una connessione;)

0

E 'possibile comprimere i file in diversi mazzi, ad esempio, creare 15 file zip, ognuno con 100 immagini e quindi caricare lo zip, in questo modo sarà più veloce ed efficiente.

ci sono librerie libere per creare zip dinamicamente (ad esempio SharpZipLib)

0

Usa Multithreading - Aperte le connessioni FTP 3-4 alla volta e upload di file in parallelo.

0

Informazioni sull'utilizzo di una delle librerie client FTP di terze parti? Molti di loro non cercano di nascondere che l'FTP non è un protocollo stateless (diversamente da FtpWebRequest).

Il seguente codice utilizza il nostro Rebex FTP/SSL ma ce ne sono anche molti altri.

// create client, connect and log in 
Ftp client = new Ftp(); 
client.Connect("ftp.example.org"); 
client.Login("username", "password"); 
client.ChangeDirectory("/ftp/target/fir"); 

foreach (string localPath in picPath) 
{ 
    client.PutFile(localPath, Path.GetFileName(localPath)); 
} 

client.Disconnect(); 

Oppure (se tutti i file di origine si trovano nella stessa cartella):

// create client, connect and log in 
Ftp client = new Ftp(); 
client.Connect("ftp.example.org"); 
client.Login("username", "password"); 

client.PutFiles(
    @"c:\localPath\*", 
    "/remote/path", 
    FtpBatchTransferOptions.Recursive, 
    FtpActionOnExistingFiles.OverwriteAll); 

client.Disconnect();