【问题标题】:Show filename and error in a list on a form在表单的列表中显示文件名和错误
【发布时间】:2013-06-03 18:44:58
【问题描述】:

我正在创建一个文件夹监视器,用于扫描文件夹以查找传入的 xml 文件。在文件夹中创建 xml 文件后,将解析该文件,解析后将其移动到“已处理”文件夹。现在有很多事情显然会出错,我希望能够以这种方式显示错误列表:

文件名 1 >> 错误

文件名 2 >> 错误

但我真的不知道从哪里开始。我应该用字符串/字符串对制作字典并将其显示在表格中吗?或者这里最好的选择是什么。我试过用谷歌搜索,但很难找到这样的例子。

提前致谢。

【问题讨论】:

  • 从这个答案中使用类似的东西:stackoverflow.com/questions/252323/…
  • 监视文件夹要注意的一件事是确保您不要尝试读取仍在写入的文件。如果创建文件以使用其最终文件名进行写入,则很容易发生这种情况。更好的设计是使用临时名称打开文件,例如myFile.tmp,将数据写入其中,关闭它,然后将 myFile.tmp 重命名为 myFile.xml 或其他任何内容。您的显示器必须忽略 .tmp 文件。

标签: c# winforms error-handling


【解决方案1】:

您可以使用 Enterprise Library 进行日志记录,也可以像这样创建自己的 Logger 类:

public static class Logger
{
    public static List<Error> Logs = new List<Error>();

    public static void Log(Exception ex,string fileName)
    {
        Logs.Add(new Error
        {
            Message = ex.Message,
            FileName = fileName
        });
        //Here you can log errors to database,txt or xml too.
    }
}

public class Error
{
    public string Message { get; set; }
    public string FileName { get; set; }
}

并在 FileSystemWatcher 类中使用您的记录器,像这样创建事件:

void watcher_Created(object sender, FileSystemEventArgs e)
    {
        try
        {
            //Your logic
        }
        catch (Exception ex)
        {
            Logger.Log(ex, e.Name);
            //To show your logs in grid
            dataGridView.DataSource = null;
            dataGridView.DataSource = Logger.Logs;
        }
    }

【讨论】:

    【解决方案2】:

    正如您所说,您可以使用 Dictionary 然后放入数据表,然后可能将其绑定到 DataGrid,例如:

            Dictionary<String, String> dict = new Dictionary<String,String>();
            dict.Add("Filename1","Error1");
            dict.Add("Filename2","Error2");
            dict.Add("Filename3","Error3");
            DataTable table = new DataTable();
    
            table.Columns.Add("Filename", typeof(String));
            table.Columns.Add("Error_Description", typeof(String));
    
            foreach (KeyValuePair<String,String> dictval in dict)
                {
                    table.Rows.Add(dictval.Key, dictval.Value);
                }
            dataGridView1.DataSource = table;
    

    【讨论】:

      【解决方案3】:

      你真的应该考虑使用类似log4net 的东西来进行日志记录。可以是downloaded here。而且配置非常简单。在您的app.config 文件中,您可以将section 标签添加到configSections 标签,然后添加log4net 配置标签。

      <?xml version="1.0" encoding="utf-8" ?>
      <configuration>
      
        <configSections>
          <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" />
        </configSections>
      
        <log4net>
          <root>
            <level value="ALL" />
            <appender-ref ref="EventLogAppender" />
          </root>
          <appender name="EventLogAppender" type="log4net.Appender.EventLogAppender">
            <threshold value="DEBUG" />
            <applicationName value="Lantic YCS WebServer" />
            <layout type="log4net.Layout.PatternLayout">
              <conversionPattern value="(%-5level %date{hh}:%date{mm}:%date{ss} [%thread] %logger [%property{NDC}] ) %message %n" />
            </layout>
          </appender>
        </log4net>
      
      </configuration>
      

      然后在你的代码中你只需要初始化它,所以在每个类文件的顶部放入这一行:

      private static readonly ILog log = LogManager.GetLogger(typeof(Global));
      

      允许你说类似的话:

      log.Error(...);
      

      而且,当应用程序第一次启动时,不要忘记运行这一行:

      log4net.Config.XmlConfigurator.Configure();
      

      现在,解决我个人的一个更有趣的问题。您说您正在构建一个文件夹监视器。你真的不想或不需要构建它。请使用已经可用的FileSystemWatcher。它非常高效,而且可过滤,因此您可以获得所需的消息。

      【讨论】:

      • 谢谢,我会调查的。当然,我正在使用 FileSystemWatcher :) 我正在围绕它构建一个应用程序。但感谢您提供的信息。
      • @Rob,我很欣慰你已经在使用FileSystemWatcher
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-05-20
      • 1970-01-01
      • 2015-11-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多