2016-06-14 64 views
1

我的筆記本電腦中有近200個文本文件,我用C#編寫了代碼,它逐行讀取這些文本文件,並在FTP服務器中爲每行創建一個目錄。在FTP上快速創建多個空目錄

這是我的代碼:

static void Main() 
{ 
    for (int i = 0; i <= 200; i++) 
    { 
     var lines = File.ReadAllLines(@"D:\file_" + i.ToString().PadLeft(5, '0') + ".txt"); 
     foreach (var line in lines) 
     { 
      try 
      { 
       WebRequest request = WebRequest.Create("ftp://myftp/dir/" + line); 
       request.Method = WebRequestMethods.Ftp.MakeDirectory; 
       request.Credentials = new NetworkCredential("user", "pass"); 
       request.GetResponse(); 
      } 
      catch (Exception ex) 
      {} 
     } 
    } 
} 

但是,這是創建目錄很慢,是否有其他更快的方式做到這一點?例如,將文本文件作爲數組獲取並創建其所有目錄。

+2

程序的慢部分肯定不是你的文本文件閱讀。 – nvoigt

回答

0

程序的緩慢部分是您逐個發送的請求。 你可以做一些技巧,以加速它們:

// allow more connections at a time 
ServicePointManager.DefaultConnectionLimit = 30; 
// don't wait the 100ms every request do 
ServicePointManager.Expect100Continue = false; 

而且你可以發送多線程的要求,所以你沒有,直到它完成,等待每一個要求。但請注意,很多請求可能會導致服務器無法運行。 200應該不成問題。

在這裏,你有一些代碼,你可以測試:

的文本文件的
static void Main() 
{ 
    // allow more connections at a time 
    ServicePointManager.DefaultConnectionLimit = 30; 
    // don't wait the 100ms every request do 
    ServicePointManager.Expect100Continue = false; 

    List<Task> tasks = new List<Task>(); 

    for (int i = 0; i <= 200; i++) 
    { 
     var lines = File.ReadAllLines(@"D:\file_" + i.ToString().PadLeft(5, '0') + ".txt"); 
     foreach (var line in lines) 
     { 
      tasks.Add(Task.Run(() => 
       { 
        try 
        { 
         WebRequest request = WebRequest.Create("ftp://myftp/dir/" + line); 
         request.Method = WebRequestMethods.Ftp.MakeDirectory; 
         request.Credentials = new NetworkCredential("user", "pass"); 
         request.GetResponse(); 
        } 
        catch (Exception ex) 
        { } 
       } 
      )); 
     } 
    } 

    Task.WaitAll(tasks.ToArray()); 
} 
1

閱讀實在是沒有問題的。慢的部分是FTP。

使用多個線程parallelize the processing

List<Task> tasks = new List<Task>(); 

for (int i = 0; i <= 200; i++) 
{ 
    tasks.Add(new Task(() => 
     { 
      var lines = 
       File.ReadAllLines(@"D:\file_" + i.ToString().PadLeft(5, '0') + ".txt"); 

      foreach (var line in lines) 
      { 
       WebRequest request = WebRequest.Create("ftp://myftp/dir/" + line); 
       request.Method = WebRequestMethods.Ftp.MakeDirectory; 
       request.Credentials = new NetworkCredential("user", "pass"); 
       request.GetResponse(); 
      } 
     } 
    )); 
} 

Task.WaitAll(tasks.ToArray()); 

但要注意,你也應該採取處置的WebResponse的照顧。