2010-03-05 20 views
6

Requisito, subir 1500 jpg de imágenes cada noche, el código a continuación se abre y cierra una conexión muchas veces, me pregunto si hay una mejor manera.Cargar múltiples archivos FTP

... Este es un fragmento de código, por lo que hay aquí son variables que se definen en otro lugar

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 

Algunos comentarios:

Sí, lo sé picCount es redundante ... Era tarde en la noche.

ftpImagePath, picDir, ftpUsername, ftpPassword son todas las variables

Sí, esto es sin cifrar

Este código funciona bien, estoy buscando para optimizar

pregunta relacionada: FTP Upload multiple files without disconnect using .NET

+0

Nota: El problema que tengo con este código es que mantiene la apertura de una nueva conexión FTP. Se abre y cierra 1500 veces cada vez que se ejecuta esta aplicación. – Markus

Respuesta

5

Puede echar un vistazo a enviar los archivos de forma asíncrona si desea enviar más de un archivo a la vez (si el pedido no es importante). Echar un vistazo a los diferentes métodos Begin y End * * como FtpWebRequest.BeginGetResponse y FtpWebRequest.EndGetResponse etc.

Además se podría mirar en la propiedad FtpWebRequest.KeepAlive, que se utiliza para mantener una conexión abierta/en caché para su reutilización.

Hmmm, también podría intentar crear un archivo tar gigante y enviar el archivo individual en una corriente con una conexión;)

0

¿Es posible comprimir los archivos en diferentes ramos, por ejemplo, crear 15 archivos zip, cada uno tiene 100 imágenes y luego sube el zip, de esa manera será más rápido y más eficiente.

Hay bibliotecas libres para crear dinámicamente postal (por ejemplo SharpZipLib)

0

Uso multihilo - Abiertas 3-4 conexiones FTP a la vez y cargar archivos en paralelo.

0

¿Qué hay de usar alguna de las bibliotecas de cliente FTP de terceros? La mayoría de ellos no trata de ocultar que FTP no es un protocolo sin estado (a diferencia de FtpWebRequest).

El siguiente código utiliza nuestro Rebex FTP/SSL pero también hay muchos otros.

// 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(); 

O (si todos los archivos de origen están en la misma carpeta):

// 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(); 
Cuestiones relacionadas