在FTP上快速创建多个空目录

时间:2016-06-14 06:39:41

标签: c# .net ftp

我的笔记本电脑中有近200个文本文件,我在C#中编写代码,逐行读取这些文本文件,并在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 个答案:

答案 0 :(得分: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

答案 1 :(得分: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());
}