2

从最近几天开始,我几乎陷入了一个问题。我有一个位于远程服务器上的文件,可以使用用户 ID 和密码访问。那么访问没有问题。

问题是我有大约 150 个。并且它们每个都是可变大小的,最小为 2 MB,最大为 3 MB。

我必须一一阅读它们并从中读取最后一行/行数据。我在我当前的代码中这样做。

主要问题是它需要太多时间,因为它是从上到下读取文件。

       public bool TEst(string ControlId, string FileName, long offset)
    {
        // The serverUri parameter should use the ftp:// scheme. 
        // It identifies the server file that is to be downloaded 
        // Example: ftp://contoso.com/someFile.txt. 

        // The fileName parameter identifies the local file. 
        //The serverUri parameter identifies the remote file. 
        // The offset parameter specifies where in the server file to start reading data. 
        Uri serverUri;
        String ftpserver = "ftp://xxx.xxx.xx.xxx/"+FileName;
        serverUri = new Uri(ftpserver);


        if (serverUri.Scheme != Uri.UriSchemeFtp)
        {
            return false;
        }
        // Get the object used to communicate with the server.
        FtpWebRequest request = (FtpWebRequest)WebRequest.Create(serverUri);
        request.Credentials = new NetworkCredential("test", "test");

        request.Method = WebRequestMethods.Ftp.DownloadFile;
       
        //request.Method = WebRequestMethods.Ftp.DownloadFile;
        
        request.ContentOffset = offset;
        FtpWebResponse response = null;
        try
        {
            response = (FtpWebResponse)request.GetResponse();
           // long Size = response.ContentLength;
           
        }
        catch (WebException e)
        {
            Console.WriteLine(e.Status);
            Console.WriteLine(e.Message);
            return false;
        }

       
        // Get the data stream from the response.
        Stream newFile = response.GetResponseStream();
        // Use a StreamReader to simplify reading the response data.
        StreamReader reader = new StreamReader(newFile);
        string newFileData = reader.ReadToEnd();
        // Append the response data to the local file 
        // using a StreamWriter.


        string[] parser = newFileData.Split('\t');

        string strID = parser[parser.Length - 5];
        string strName = parser[parser.Length - 3];
        string strStatus = parser[parser.Length-1];

        if (strStatus.Trim().ToLower() != "suspect")
        {
            HtmlTableCell control = (HtmlTableCell)this.FindControl(ControlId);
            control.InnerHtml = strName.Split('.')[0];
        }
        else
        {
            HtmlTableCell control = (HtmlTableCell)this.FindControl(ControlId);
            control.InnerHtml = "S";
        }


        // Display the status description. 

        // Cleanup.
      
        reader.Close();
        response.Close();
        //Console.WriteLine("Download restart - status: {0}", response.StatusDescription);
        return true;
    }

穿线:

  protected void Page_Load(object sender, EventArgs e)
  {
     

     new Task(()=>this.TEst("controlid1", "file1.tsv", 261454)).Start();
     new Task(()=>this.TEst1("controlid2", "file2.tsv", 261454)).Start();
  }
4

4 回答 4

2

FTP 无法查找文件以仅读取最后几行。 参考:FTP 命令您必须与远程 ftp 服务器的开发人员和所有者协调,并要求他们制作一个包含您需要的数据的附加文件。

示例 要求远程 ftp 服务器的所有者为每个文件创建一个 [filename]_lastrow 文件,该文件包含文件的最后一行。然后,您的程序将对 [filename]_lastrow 文件进行操作。您可能会对“好的,我们可以为您做到”的包容回答感到惊喜

如果 ftp 服务器无法更改,请请求数据库连接。

于 2013-09-21T13:51:58.037 回答
1

您还可以并行下载所有文件,并在完成后开始将它们弹出到队列中进行解析,而不是同步执行此过程。如果 ftp 服务器可以处理更多的连接,请尽可能多地使用该方案。解析也可以并行完成。

更多阅读:System.Threading.Tasks

它有点被埋没了,但我在您的原始答案中发表了评论。这个 SO 问题导致了这篇博客文章,其中有一些很棒的代码可供您借鉴。

于 2013-09-22T09:49:43.017 回答
0

您可以使用 Seek 直接跳到 Stream 的末尾,而不是您的 while 循环。然后,您希望通过流向后工作,直到找到第一个新行变量。这篇文章应该给你你需要知道的一切。

获取最后 10 行非常大的文本文件 > 10GB

于 2013-09-18T15:35:44.657 回答
0

FtpWebRequest包括ContentOffset属性。查找/选择一种方法来保留最后一行的偏移量(本地或远程 - 即通过将 4 字节文件上传到 ftp)。这是最快的方法,也是最适合网络流量的方法。

有关FtpWebRequest的更多信息,请访问MSDN

于 2013-09-27T22:38:29.923 回答