【问题标题】:URI error loading from txt file从 txt 文件加载 URI 错误
【发布时间】:2015-09-16 04:23:58
【问题描述】:

我的一段基本代码有问题:

var objReader = new StreamReader(ofDialog.FileName);
while (objReader.Peek() >= 0)
{
    Helpers.returnMessage(objReader.ReadLine());
    // trim the url to root
    var uri = new Uri(objReader.ReadLine());
    var host = uri.Host;
}

我正在加载一个 .txt 的 url 文件,尝试使用 uri.host 修剪到根目录,但出现错误:

值不能为空。参数名称:UriString

但如果我硬编码一个网址:var uri = new Uri("https://stackoverflow.com/questions/ask");

它工作正常,似乎是当我从 .txt 文件加载时。

任何帮助将不胜感激。

完整代码:

    private void btnInput_Click(object sender, EventArgs e)
    {
        // ofDialog settings
        ofDialog.Filter = @"TXT Files|*.txt";
        ofDialog.Title = @"Select your source backlink file...";
        ofDialog.FileName = "URLs.txt";

        // is cancel pressed?
        if (ofDialog.ShowDialog() == DialogResult.Cancel)
            return;
        try
        {
            var objReader = new StreamReader(ofDialog.FileName);
            while (objReader.Peek() >= 0)
            {
                //Helpers.returnMessage(objReader.ReadLine());
                // trim the url to root
                var x = objReader.ReadLine();
                Helpers.returnMessage(x);
                // trim the url to root
                var uri = new Uri(x);
                var host = uri.Host;

                //Helpers.returnMessage(host);

                // extract urls here
                var wc = new WebClient();
                var html = wc.DownloadString(objReader.ReadLine());

                // 1. Find all matches in file
                var m1 = Regex.Matches(html, @"(<a.*?>.*?</a>)",
                    RegexOptions.Singleline);

                // 2. Loop over each match
                foreach (Match m in m1)
                {
                    var value = m.Groups[1].Value;
                    string href;
                    // 3. Get href attribute
                    var m2 = Regex.Match(value, @"href=\""(.*?)\""",
                    RegexOptions.Singleline);
                    if (m2.Success)
                    {
                        href = m2.Groups[1].Value;
                    }
                    else
                    {
                        continue;
                    }

                    // add to the results
                    if (href.StartsWith("http"))
                    {
                        //Helpers.returnMessage(href);
                        if (!href.Contains(host)) 
                        {
                            // add urls to the listview
                            var lvi = new ListViewItem(href);
                            listViewMain.Items.Add(lvi);
                        }
                    }
                }
            }
        }
        catch (Exception ex)
        {
            Helpers.returnMessage(ex.Message);
        }
    }

returnMessage() 实际上只是返回一个消息框弹出窗口。

【问题讨论】:

  • 您是否尝试过调试您的代码并在您单步执行时查看 objReader.ReadLine() 的值是多少?
  • 在构建 uri 时,您可能会提前两次阅读器。一次在 Helpers.returnMessage() 中,然后在 new Uri() 构造函数中。记录你传递给这些函数的值,然后你会看到你是否错过了真正的行。
  • 您是否故意每次迭代读取两行?我们不知道Helpers.returnMessage 做了什么也无济于事。
  • txt文件是空的吗?

标签: c#


【解决方案1】:

试试这个:

var objReader = new StreamReader(ofDialog.FileName);
while (objReader.Peek() >= 0)
{
   string x = objReader.ReadLine();
   Helpers.returnMessage(x);
  // trim the url to root
   var uri = new Uri(x);
   var host = uri.Host;
}

【讨论】:

  • 在我看到 Helpers.returnMessage(x);我得到错误:值不能为空。参数名称:UriString,但它确实有效,但之后立即抛出该错误。
  • @graham23s,Helpers.returnMessage 的代码是什么?
  • public static void returnMessage(string message) { MessageBox.Show(message, AppTitle, MessageBoxButtons.OK, MessageBoxIcon.Information); }
  • public const string AppTitle = "URL Extractor";
  • @graham23s,x 的值是多少?我刚刚更新了代码。
猜你喜欢
  • 2012-11-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-06
  • 1970-01-01
  • 2012-09-08
  • 2012-05-11
  • 1970-01-01
相关资源
最近更新 更多