2

私はここ数日の問題にかなり悩まされています。リモートサーバーにあるファイルは、userId とパスワードを使用してアクセスできます。まあ、アクセスには問題ありません。

問題は、約150個あることです。それぞれが可変サイズで、最小は 2 MB、最大は 3 MB です。

それらを1つずつ読み取り、最後の行/行データを読み取る必要があります。私は現在のコードでそれをやっています。

主な問題は、ファイルを上から下に読み取るため、時間がかかりすぎることです。

       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 に答える
0

FtpWebRequestにはContentOffsetプロパティが含まれています。最後の行のオフセットを保持する方法を見つけて選択します (ローカルまたはリモート - つまり、4 バイトのファイルを ftp にアップロードします)。これが最速の方法であり、ネットワーク トラフィックに最適です。

FtpWebRequestの詳細については、MSDNを参照してください。

于 2013-09-27T22:38:29.923 に答える