代码之家  ›  专栏  ›  技术社区  ›  Lajos Arpad

当命令在.NET的FTP服务器上失败时会发生什么?

  •  1
  • Lajos Arpad  · 技术社区  · 14 年前

    我有以下源代码:

    public static void FTP_SERVER()
    {
        FtpWebRequest request = (FtpWebRequest)WebRequest.Create("ftp://myurl.com/mainfolder/");
        request.Method = WebRequestMethods.Ftp.ListDirectory;
        request.Credentials = new NetworkCredential("myusername", "mypassword");
        FtpWebResponse response = (FtpWebResponse)request.GetResponse();
        Stream responseStream = response.GetResponseStream();
        StreamReader reader = new StreamReader(responseStream);
        ArrayList directories = new ArrayList();
        while (!reader.EndOfStream)
        {
            String directory = reader.ReadLine();
            int i = 0;
            for (i = 0; i < directories.Count && Convert.ToInt32(directory) > Convert.ToInt32(directories[i] + ""); i++);
            directories.Insert(i, directory);
        }
        String[] agents = Crawler.CrawlerDbUtils.getAllAgentIDs();
    
        reader.Close();
        response.Close();
        int j = 0;
        for (int i = 0; i < directories.Count; i++)
        {
            try
            {
                while ((j < agents.Length) && (Convert.ToInt32(agents[j]) < Convert.ToInt32(directories[i] + "")))
                {
                    try
                    {
                        request = (FtpWebRequest)WebRequest.Create("ftp://myurl.com/mainfolder/" + agents[j]);
                        request.Method = WebRequestMethods.Ftp.MakeDirectory;
                        request.Credentials = new NetworkCredential("myusername", "mypassword");
                        response = (FtpWebResponse)request.GetResponse();
                        responseStream = response.GetResponseStream();
                        response.Close();
                    }
                    catch (Exception exception)
                    { }
                    j++;
                }
                if (Convert.ToInt32(agents[j]) == Convert.ToInt32(directories[i] + ""))
                {
                    request = (FtpWebRequest)WebRequest.Create("ftp://myurl.com/mainfolder/" + directories[i] + "/");
                    request.Method = WebRequestMethods.Ftp.ListDirectory;
                    request.Credentials = new NetworkCredential("myusername", "mypassword");
                    response = (FtpWebResponse)request.GetResponse();
                    responseStream = response.GetResponseStream();
                    reader = new StreamReader(responseStream);
                    ArrayList files = new ArrayList();
                    while (!reader.EndOfStream)
                    {
                        String file = reader.ReadLine();
                        int q = 0;
                        for (q = 0; q < files.Count && file.CompareTo(files[q] + "") > 0; q++) ;
                        files.Insert(q, file);
                    }
                    reader.Close();
                    response.Close();
                    String[] dbFiles = Crawler.CrawlerDbUtils.getAllPictures(directories[i] + "");
                    int r = 0;
                    for (int q = 0; q < files.Count; q++)
                    {
                        while ((r < dbFiles.Length) && ((dbFiles[r] + "").CompareTo(files[q] + "") < 0))
                        {
                            r++;
                        }
                        try
                        {
                            if ((r >= dbFiles.Length) || ((dbFiles[r] + "").Equals(files[q]) == false))
                            {
                                request = (FtpWebRequest)WebRequest.Create("ftp://myurl.com/mainfolder/" + directories[i] + "/" + files[q]);
                                request.Method = WebRequestMethods.Ftp.DeleteFile;
                                request.Credentials = new NetworkCredential("myusername", "mypassword");
                                response = (FtpWebResponse)request.GetResponse();
                                responseStream = response.GetResponseStream();
                                response.Close();
                            }
                        }
                        catch (Exception exception)
                        { }
                    }
                    j++;
                }
                else
                {
                    request = (FtpWebRequest)WebRequest.Create("ftp://myurl.com/mainfolder/" + directories[i] + "/");
                    request.Method = WebRequestMethods.Ftp.ListDirectory;
                    request.Credentials = new NetworkCredential("myusername", "mypassword");
                    response = (FtpWebResponse)request.GetResponse();
                    responseStream = response.GetResponseStream();
                    reader = new StreamReader(responseStream);
                    ArrayList files = new ArrayList();
                    while (!reader.EndOfStream)
                    {
                        files.Add(reader.ReadLine());
                    }
                    reader.Close();
                    response.Close();
                    for (int k = 0; k < files.Count; k++)
                    {
                        request = (FtpWebRequest)WebRequest.Create("ftp://myurl.com/mainfolder/" + directories[i] + "/" + files[k]);
                        request.Method = WebRequestMethods.Ftp.DeleteFile;
                        request.Credentials = new NetworkCredential("myusername", "mypassword");
                        response = (FtpWebResponse)request.GetResponse();
                        responseStream = response.GetResponseStream();
                        response.Close();
                    }
                    request = (FtpWebRequest)WebRequest.Create("ftp://myurl.com/mainfolder/" + directories[i] + "/");
                    request.Method = WebRequestMethods.Ftp.RemoveDirectory;
                    request.Credentials = new NetworkCredential("myusername", "mypassword");
                    response = (FtpWebResponse)request.GetResponse();
                    responseStream = response.GetResponseStream();
                    response.Close();
                }
            }
            catch (Exception exception)
            {
            }
        }
        while (j < agents.Length)
        {
            try
            {
                request = (FtpWebRequest)WebRequest.Create("ftp://myurl.com/mainfolder/" + agents[j] + "/");
                request.Method = WebRequestMethods.Ftp.MakeDirectory;
                request.Credentials = new NetworkCredential("myusername", "mypassword");
                response = (FtpWebResponse)request.GetResponse();
                responseStream = response.GetResponseStream();
                response.Close();
            }
            catch (Exception exception)
            { }
            j++;
        }
        MessageBox.Show("DONE");
    
    }
    

    存储在数据库中的目录ID将加载到名为agents的字符串[]中。

    目录将按升序排序,类似地,代理按升序排序(在这个项目中,它们都是数字,所以按数字排序)

    如果服务器上存在一个目录,但数据库中不存在该目录,则该目录将被删除(首先删除其所有文件,然后文件夹本身也将被删除)

    如果一个目录在服务器上不存在,但存在于存储目录列表中,则会在服务器上创建它。

    如果服务器上和存储目录列表中都存在目录,则不推荐使用的文件将被删除。服务器上相应目录中的文件称为文件,存储在数据库中的文件存储在 String[] 称为dbFiles。

    这个函数本质上是创建要创建的文件夹,删除要删除的文件夹,删除要删除的文件,并且可以正常工作。但是,我注意到,在某些情况下,当服务器发生错误时,索引会下降,我想知道原因是什么。

    我的问题是:为什么每次捕捉到以前发生的错误时,我的索引都会回落?

    我怎样才能防止这种倒退?

    3 回复  |  直到 9 年前
        1
  •  3
  •   Mohamed Nuur    14 年前

    您应该重构代码,使ftp命令位于函数中,而不是到处复制/粘贴这些ftp命令,您有如下流程:

    String[] directories = ftpGetListing("ftp://myurl.com/mainfolder/");
    String[] agents = Crawler.CrawlerDbUtils.getAllAgentIDs();
    
    String[] combinedDirectories = getElementsInBothArray(directories, agents);
    String[] serverOnlyDirectories = getElementsOnlyInFirstArray(directories, agents);
    String[] agentOnlyDirectories = getElementsOnlyInFirstArray(agents, directories);
    
    // step 1: delete all server only directories
    ftpDeleteDirectories("ftp://myurl.com/mainfolder/", serverOnlyDirectories);
    
    // step 2: create all agent only directories
    ftpCreateDirectories("ftp://myurl.com/mainfolder/", agentOnlyDirectories);
    
    // step 3: depricate all files
    foreach(String dir in combinedDirectories)
    {
      String ftpDir = "ftp://myurl.com/mainfolder/" + dir + "/";
      String[] serverFiles = ftpGetListing(ftpDir);
      String[] agentFiles = Crawler.CrawlerDbUtils.getAllPictures(dir);
    
      String[] serverOnlyFiles = getElementsOnlyInFirstArray(serverFiles, agentFiles);
    
      foreach(String file in serverOnlyFiles)
      {
        ftpDeleteFile(ftpDir + file);
      }
    }
    

    然后你只需要实现非常简单的函数 ftpGetListing ftpDeleteDirectories , ftpCreateDirectories ftpDeleteFile getElementsInBothArrays getElementsOnlyInFitstArray

        2
  •  1
  •   Conrad Frix    14 年前

    控制台的输出会根据//throw new invalidoOperationException是否被注释掉而发生很大的变化。快到你的时候了!阅读器.EndOfStream).

    老实说,这个流程相当复杂。如果你能把这种方法分解成一小块一小块的话,你会得到很好的服务。

    class Program
    {
        static void Main(string[] args)
        {
            int agentCount = 1000;
            int directoriesCount =100;
            int fileCount = 100;
            int dbFilesCount = 100;
            int j = 0;
            for (int i = 0; i < directoriesCount; i++)
            {
                Console.WriteLine("I : {0}", i);
                try
                {
                    while ((j < agentCount))
                    {
                        try
                        {
    
                        }
                        catch (Exception exception)
                        { }
                        j++;
                        Console.WriteLine("J : {0}", j);
                    }
                    if (true)
                    {
    
                        //throw new InvalidOperationException("Some error"); UnComment and see
                        while (false)
                        {
    
                        }
    
    
                        int r = 0;
                        for (int q = 0; q < fileCount; q++)
                        {
                            while ((r < dbFilesCount) )
                            {
                                r++;
                            }
                            try
                            {
                                if ((r >= dbFilesCount))
                                {
    
                                }
                            }
                            catch (Exception exception)
                            { }
                        }
                        j++;
                        Console.WriteLine("J : {0}", j);
                    }
                    else
                    {
    
                        while (false)
                        {
    
                        }
    
                        for (int k = 0; k < fileCount; k++)
                        {
    
                        }
    
                    }
                }
                catch (Exception exception)
                {
                }
            }
            while (j < agentCount)
            {
                try
                {
    
                }
                catch (Exception exception)
                { }
                j++;
                Console.WriteLine("J : {0}", j);
            }
            Console.WriteLine("Done");
            Console.ReadLine();
    
    
        }
    }
    
        3
  •  1
  •   Lajos Arpad    14 年前

    我找到了解决办法。

    首先,必须设置此项以避免出现问题:

    request.KeepAlive = false;
    

    第二,在渔获物中必须包括:

    response.Close();
    responseStream.Close();
    

    response.Close();
    

    我不确定这个问题的原因,但我认为C正在为我的源代码制造一个分支。