【问题标题】:C#: Storing the content of an ini file as string or dictionary instead of file name?C#:将ini文件的内容存储为字符串或字典而不是文件名?
【发布时间】:2012-08-09 05:36:59
【问题描述】:

有没有办法将文件的内容存储为字符串或字典,而不仅仅是文件路径/名称?

以下是我目前用于从 Windows 窗体获取文件路径的方法。有没有办法适应它或者我应该从头开始?我正在加载只有文本的 .ini 文件。 LINQ 好像是一条路但是我不太熟悉。

public void ShowSettingsGui()
{
    System.Windows.Forms.OpenFileDialog ofd = new System.Windows.Forms.OpenFileDialog();
    ofd.Multiselect = false;
    ofd.Filter = "Data Sources (*.ini)|*.ini*|All Files|*.*";
    if (ofd.ShowDialog() == DialogResult.OK)
    {
        string[] filePath = ofd.FileNames;
    }
    m_settings = Path.GetDirectoryName(ofd.FileName);
}

【问题讨论】:

  • 是的,您将文件读入带有(天哪!)System.IO.Filexxx 类的数组。
  • 您的代码允许多选。是否要存储所有选定文件的内容?
  • 你需要给方法名加上括号。 string[] lines = System.IO.File.ReadAllLines();。这正是我告诉codesparkle 向您展示LINQ 版本会带来更多混乱的原因。在某些 LINQ 行中,您可以“将函数传递给 LINQ”,我的意思是:Give-LINQ-A-Function。在这些情况下,您就像使用变量一样,所以您只需编写System.IO.File.ReadAllLines。但是,现在您想立即运行该功能,而不是把它交给别人来玩。你想调用函数,你用括号来做:System.IO.File.ReadAllLines()
  • 还有一件事:System.IO.File.ReadAllLines 需要一个参数,因为必须告诉该函数您要读取什么文件。如果你只写一个System.IO.File.ReadAllLines() 这将是一个错误,因为它不知道该读什么。因此,必须传递一个文件名:string[] lines = System.IO.File.ReadAllLines("c:\\blah\\boom.ini");,现在就可以了。当然,文件名不必硬编码,可以放在变量中,也可以直接从 fileDialog.FileName 中获取:string[] lines = System.IO.File.ReadAllLines(dialog.FileName);
  • 这里是“新手”的 LINQ 混淆:请注意,LINQ 表示 paths.ToDictionary(filePath => filePath, File.ReadAllText),因此 ReadAllText 没有参数,而“手工代码”表示 .. = File.ReadAllText(filename);,否则这是一个错误。多亏了一些智能机制,LINQ 能够为您猜测和插入参数 - 但前提是您必须非常小心地制作其余部分。

标签: c# forms dictionary ini


【解决方案1】:

如果您可以添加对您要完成的工作的描述,那将会有所帮助。

同样,我会使用设置类来存储/读取设置

这里是如何使用它的链接: write user settings

过去我用xml来解析设置文件,我发现它比顺序读取ini要容易得多。

希望对你有帮助

【讨论】:

  • 没关系,我看到您正在寻找文件名和路径
【解决方案2】:

LINQ 确实是一个很好的方法:我们只需将路径转换为字典(它们成为键)。这些值是通过在每个文件路径上调用File.ReadAllText 来确定的。

var dialog = new OpenFileDialog() { Multiselect = true, 
    Filter = "Data Sources (*.ini)|*.ini*|All Files|*.*" };
if (dialog.ShowDialog() != DialogResult.OK) return;
var paths = dialog.FileNames;
var fileContents = paths.ToDictionary(filePath => filePath, File.ReadAllText);

为了帮助您了解这里发生了什么,请查看(大致等效的)非 LINQ 版本。在这里,我们显式地遍历 FileNames 并将它们作为键添加到我们的字典中,同时再次对它们中的每一个调用 File.ReadAllText

// same as first snippet without the last line
foreach (var filePath in paths)
{
    fileContents.Add(filePath, File.ReadAllText(filePath));
}

在每个sn-p的最后一行设置一个断点,运行它们并查看字典的内容以确定结果。

编辑:问题不清楚,但您似乎只对单个文件名感兴趣。这意味着您根本不需要 LINQ(m_settings 必须是 string)。

var dialog = new OpenFileDialog{Filter = "Data Sources (*.ini)|*.ini*|All Files|*.*"};
if (dialog.ShowDialog() != DialogResult.OK) return;
m_settings = File.ReadAllText(dialog.FileName);

【讨论】:

  • +!,因为您的答案是 100% 有效和正确的。不过相信对题主理解文件操作没有帮助。。
  • @quetzalcoatl 是的,File 类是一个非常高级的包装器,但我认为使用 StreamReaders 之类的文件访问不再有意义......跨度>
  • @codesparkle 非常感谢,抱歉为什么 File 类是高级包装器?
  • @arthurmani,我的意思是它隐藏你访问文件的细节 - 这很方便,因为生成的代码很好而且清晰。 an example on MSDN 展示了旧的、更容易出错的方法。
  • 非常感谢@codesparkle 你知道为什么我得到以下输出而不是字典本身吗? {0} 0. System.Collections.Generic.Dictionary`2[System.String,System.String]
猜你喜欢
  • 2016-02-19
  • 2022-11-12
  • 1970-01-01
  • 2014-07-01
  • 1970-01-01
  • 2019-03-25
  • 2011-05-04
  • 1970-01-01
  • 2021-09-15
相关资源
最近更新 更多