C# 使用C解析robots.txt文件中的单个行#
正在使用应用程序解析robots.txt。我自己编写了一个方法,从Web服务器中提取文件,并将输出放入文本框。我希望输出为文件中的每一行显示一行文本,就像您正常查看robots.txt时显示的一样,但是我文本框中的输出是所有文本行,没有回车符或换行符。所以我想我会很狡猾,为所有的行做一个字符串[],做一个foreach循环,一切都会很好。唉,这不起作用,所以我想我应该试试System.Environment.Newline,仍然不起作用。这是现在听起来的代码……我如何更改它,从而获得robots.txt的所有单独行,而不是拼凑在一起的一堆文本C# 使用C解析robots.txt文件中的单个行#,c#,webclient,robots.txt,C#,Webclient,Robots.txt,正在使用应用程序解析robots.txt。我自己编写了一个方法,从Web服务器中提取文件,并将输出放入文本框。我希望输出为文件中的每一行显示一行文本,就像您正常查看robots.txt时显示的一样,但是我文本框中的输出是所有文本行,没有回车符或换行符。所以我想我会很狡猾,为所有的行做一个字符串[],做一个foreach循环,一切都会很好。唉,这不起作用,所以我想我应该试试System.Environment.Newline,仍然不起作用。这是现在听起来的代码……我如何更改它,从而获得robots
public void getRobots()
{
WebClient wClient = new WebClient();
string url = String.Format("http://{0}/robots.txt", urlBox.Text);
try
{
Stream data = wClient.OpenRead(url);
StreamReader read = new StreamReader(data);
string[] lines = new string[] { read.ReadToEnd() };
foreach (string line in lines)
{
textBox1.AppendText(line + System.Environment.NewLine);
}
}
catch (WebException ex)
{
MessageBox.Show(ex.Message, null, MessageBoxButtons.OK);
}
}
您需要使textBox1多行。那我想你可以直接走了
textBox1.Lines = lines;
但是让我检查一下,您是否正在将整个文件读入
行数组的第一个元素中:
string[] lines = new string[] {read.ReadToEnd()};
因此,循环所做的就是将文件的全部内容添加到文本框中,后跟一个换行符。将该行替换为以下内容:
string content = read.ReadToEnd();
string[] lines = content.Split(new string[] { "\r\n", "\n" }, StringSplitOptions.None);
看看这是否有效
编辑:另一种可能更有效的方法,根据Fish下面关于逐行阅读的评论,用以下内容替换try
块中的代码:
Stream data = wClient.OpenRead(url);
StreamReader read = new StreamReader(data);
while (read.Peek() >= 0)
{
textBox1.AppendText(read.ReadLine() + System.Environment.NewLine);
}
尝试在while循环中使用.Read()而不是.ReadToEnd()-我认为您只是将整个文件作为行数组中的一行。调试并检查行数[]以验证这一点
编辑:下面是一些示例代码。还没有测试过,但我认为它应该可以正常工作强>
Stream data = wClient.OpenRead(url);
StreamReader read = new StreamReader(data);
List<string> lines = new List<string>();
string nextLine = read.ReadLine();
while (nextLine != null)
{
lines.Add(nextLine);
nextLine = read.ReadLine();
}
textBox1.Lines = lines.ToArray();
streamdata=wClient.OpenRead(url);
StreamReader read=新的StreamReader(数据);
列表行=新列表();
字符串nextLine=read.ReadLine();
while(nextLine!=null)
{
行。添加(下一行);
nextLine=read.ReadLine();
}
textBox1.Lines=Lines.ToArray();
试试看
这是多行…多行不是问题,Robots.txt应该为每个Disallow:或Allow:语句输出一个回车,而不是一个接一个地追加所有语句。文本环绕,当它填充时,回车返回到多行,但是我如何才能将它返回到我想要的回车位置?尝试了textbox1.lines…仍然给了我同样的问题。输出如下所示:Disallow:/etcDisallow:/adminDisAllow:/debugDisallow:/test等。我想为每个不允许或允许语句+1显示一行,显然这不是本例中的问题,但可以很容易地从问题中更正。这对我来说很有意义,但拆分需要一个字符[]……我如何修改它?我是否应该做一个切片…负索引类型的东西来查找:在每个语句中?不,Split
也将采用字符串数组,就像在我的代码中一样:您在这里编写的代码向我抛出了一堆异常。我知道它可以接受字符串[],它会抱怨char[]并将字符串转换为string[],抱歉,我遗漏了第二个参数。编辑后,再试一次。一个小小的补充是,将文件逐行读取到集合中可能比在事件发生后将其拆分更有效率,并产生更干净的代码。在本例中,reader ReadLine()方法还将为您处理不同的行尾-允许您在一个简单的“而不是在文件循环结束时将行读入集合”中进行处理。
public void getRobots()
{
WebClient wClient = new WebClient();
string robotText;
string[] robotLines;
System.Text.StringBuilder robotStringBuilder;
robotText = wClient.DownloadString(String.Format("http://{0}/robots.txt", urlBox.Text));
robotLines = robotText.Split(Environment.NewLine);
robotStringBuilder = New StringBuilder();
foreach (string line in robotLines)
{
robotStringBuilder.Append(line);
robotStringBuilder.Append(Environment.NewLine);
}
textbox1.Text = robotStringBuilder.ToString();
}