Загрузить несколько файлов FTP - PullRequest
6 голосов
/ 05 марта 2010

Требование, загружайте 1500 изображений JPG каждую ночь, приведенный ниже код открывает и закрывает соединение много раз, мне интересно, есть ли лучший способ.

... это фрагмент кода, поэтому здесь есть переменные, которые определены в других местах

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

Некоторые комментарии:

Да, я знаю, что picCount является излишним ... Это было поздно ночью.

ftpImagePath, picDir, ftpUsername, ftpPassword - все переменные

Да, это не зашифровано

Этот код работает нормально, я ищу для оптимизации

Смежный вопрос: FTP Загрузка нескольких файлов без отключения с помощью .NET

Ответы [ 4 ]

5 голосов
/ 05 марта 2010

Вы можете взглянуть на асинхронную отправку файлов, если хотите отправить более одного файла за раз (если порядок не важен). Посмотрите на различные методы Begin * и End *, такие как FtpWebRequest.BeginGetResponse и FtpWebRequest.EndGetResponse и т. Д.

Кроме того, вы можете заглянуть в свойство FtpWebRequest.KeepAlive , которое используется, чтобы сохранить соединение открытым / кэшированным для повторного использования.

Хммм, вы также можете попробовать создать один гигантский tar-файл и отправить один файл в одном потоке с одним соединением;)

0 голосов
/ 02 июля 2010

Как насчет использования какой-либо из сторонних клиентских библиотек FTP? Большинство из них не пытается скрыть, что FTP не является протоколом без сохранения состояния (в отличие от FtpWebRequest).

В следующем коде используется наш Rebex FTP / SSL , но есть и многие другие.

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

Или (если все ваши исходные файлы находятся в одной папке):

// 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();
0 голосов
/ 05 марта 2010

Использовать многопоточность - Открывайте 3-4 FTP-соединения одновременно и загружайте файлы параллельно.

0 голосов
/ 05 марта 2010

Возможно ли заархивировать файлы в разные группы, например, создать 15 zip-файлов, каждый из которых содержит 100 изображений, а затем загрузить zip-файл, чтобы это было быстрее и эффективнее.

Существуют бесплатные библиотеки для динамического создания zip (например sharpZipLib)

...