2010-08-06 12 views
4

Travail sur une application pour analyser robots.txt. Je me suis écrit une méthode qui a tiré le fichier d'un serveur Web, et a jeté la sortie dans une zone de texte. Je voudrais que la sortie affiche une seule ligne de texte pour chaque ligne dans le fichier, comme il apparaîtrait si vous regardiez le fichier robots.txt normalement, mais la sortie de ma zone de texte est toutes les lignes de texte sans retours chariot ou sauts de ligne. Alors j'ai pensé que je serais rusé, faisais une chaîne [] pour toutes les lignes, faisais une boucle foreach et tout irait bien. Hélas ça n'a pas fonctionné, alors j'ai pensé que j'essaierais System.Enviornment.Newline, ne fonctionnant toujours pas. Voici le code tel qu'il sonne maintenant ... comment puis-je changer cela afin d'obtenir toutes les lignes individuelles de robots.txt par opposition à un tas de texte bricolés ensemble?Analyse de lignes individuelles dans un fichier robots.txt avec C#

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

Répondre

7

Vous lisez le fichier entier dans le premier élément du tableau lines:

string[] lines = new string[] {read.ReadToEnd()}; 

Donc votre boucle est Le fait d'ajouter tout le contenu du fichier dans le TextBox, suivi par un caractère de nouvelle ligne. Remplacer cette ligne avec ceux-ci:

string content = read.ReadToEnd(); 
string[] lines = content.Split(new string[] { "\r\n", "\n" }, StringSplitOptions.None); 

Et voir si cela fonctionne.

Modifier: une alternative et peut-être plus efficace, selon le commentaire de poisson en dessous de la ligne de lecture en ligne remplacer le code dans le bloc try avec ceci:

Stream data = wClient.OpenRead(url); 
StreamReader read = new StreamReader(data); 

while (read.Peek() >= 0) 
{ 
    textBox1.AppendText(read.ReadLine() + System.Environment.NewLine); 
} 
+0

Cela a du sens pour moi, mais Split nécessite un char [] ... comment pourrais-je le modifier? Dois-je faire comme une tranche ... chose de type indice négatif à la recherche de: dans chaque déclaration? – Stev0

+0

Non, 'Split' prendra aussi un tableau de chaînes, comme dans mon code: http://msdn.microsoft.com/en-us/library/tabh47cf.aspx –

+0

Le code que vous avez écrit ici lance un tas d'exceptions chez moi.Je comprends que cela peut prendre une chaîne [], mordre son se plaindre de char [] et convertir une chaîne en chaîne [] – Stev0

2

Vous devez créer la multiline textBox1. Ensuite, je pense que vous pouvez simplement aller

textBox1.Lines = lines; 

mais laissez-moi vérifier que

+0

Il est multiligne .... multiligne est pas le problème, le robots.txt doit générer un retour chariot pour chaque Disallow: ou Allow: déclaration, au lieu de tous d'entre eux sont annexés l'un après l'autre. Le texte revient et le chariot revient en plusieurs lignes au fur et à mesure qu'il se remplit, mais comment puis-je l'amener au retour de chariot là où je le veux? – Stev0

+0

Avez-vous essayé de définir simplement textBox1.Line = lines? – w69rdy

+0

essayé de textbox1.Lines .... toujours en me donnant le même problème. la sortie ressemble à ceci: Disallow:/etcDisallow:/adminDisAllow:/debugDisallow:/test, ect. Je voudrais afficher une seule ligne pour chaque déclaration Disallow ou Allow – Stev0

1

Essayez d'utiliser .Lire() dans une boucle while au lieu de .ReadToEnd() - Je pense que vous obtenez juste le fichier entier comme une ligne dans votre tableau de lignes. Déboguer et vérifier le nombre de lignes [] pour le vérifier.

Editer: Voici un peu d'exemple de code. Je ne l'ai pas testé, mais je pense que ça devrait fonctionner.

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

Essayez

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