嘿伙计们,过去几天我几乎都遇到了问题。我有一个位于远程服务器上的文件,可以使用userId和密码进行访问。好,访问没问题。
问题是我有大约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();
}
答案 0 :(得分:2)
FTP无法搜索文件只读取最后几行。 Reference: FTP Commands您必须与远程ftp服务器的开发人员和所有者协调,并要求他们制作包含您所需数据的附加文件。
示例请求远程ftp服务器的所有者为每个文件创建包含文件最后一行的[filename] _lastrow文件。然后,您的程序将在[filename] _lastrow文件上运行。您可能会对“我们可以为您做到这一点”的适应性答案感到惊喜
如果无法更改ftp服务器请求数据库连接。
答案 1 :(得分:1)
您还可以并行下载所有文件,并开始将它们弹出到队列中,以便在完成后进行解析,而不是同步执行此过程。如果ftp服务器可以处理更多连接,请使用尽可能多的方案。解析也可以并行完成。
有点埋没,但我在你的原始答案中发表评论。 This SO question导致this blog post,其中包含一些您可以从中抽取的精彩代码。
答案 2 :(得分:0)
您可以使用Seek直接跳到Stream的末尾,而不是您的while循环。然后,您希望通过流向后工作,直到找到第一个新行变量。这篇文章应该为您提供您需要知道的一切。
答案 3 :(得分:0)
FtpWebRequest 包含 ContentOffset 属性。查找/选择保持最后一行偏移的方法(本地或远程 - 即通过将4字节文件上传到ftp)。这是最快的方式,也是最适合网络流量的方式。
有关 FtpWebRequest 的更多信息,请访问 MSDN