Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/298.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用C解析robots.txt文件中的单个行#_C#_Webclient_Robots.txt - Fatal编程技术网

C# 使用C解析robots.txt文件中的单个行#

C# 使用C解析robots.txt文件中的单个行#,c#,webclient,robots.txt,C#,Webclient,Robots.txt,正在使用应用程序解析robots.txt。我自己编写了一个方法,从Web服务器中提取文件,并将输出放入文本框。我希望输出为文件中的每一行显示一行文本,就像您正常查看robots.txt时显示的一样,但是我文本框中的输出是所有文本行,没有回车符或换行符。所以我想我会很狡猾,为所有的行做一个字符串[],做一个foreach循环,一切都会很好。唉,这不起作用,所以我想我应该试试System.Environment.Newline,仍然不起作用。这是现在听起来的代码……我如何更改它,从而获得robots

正在使用应用程序解析robots.txt。我自己编写了一个方法,从Web服务器中提取文件,并将输出放入文本框。我希望输出为文件中的每一行显示一行文本,就像您正常查看robots.txt时显示的一样,但是我文本框中的输出是所有文本行,没有回车符或换行符。所以我想我会很狡猾,为所有的行做一个字符串[],做一个foreach循环,一切都会很好。唉,这不起作用,所以我想我应该试试System.Environment.Newline,仍然不起作用。这是现在听起来的代码……我如何更改它,从而获得robots.txt的所有单独行,而不是拼凑在一起的一堆文本

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();
}