【问题标题】:Saving/loading a verbatim string to a text file将逐字字符串保存/加载到文本文件
【发布时间】:2018-04-13 03:35:24
【问题描述】:

我已经进行了一个月左右的编码之旅,目前正在编写我的第一个程序。它允许将代码 sn-ps 保存和组织到一个易于搜索的库中。 Screenshot

我目前使用两个列表来存储数据(一个用于条目名称,另一个用于条目内容),我已经能够通过向每个详细信息行添加标签来保存和加载到文本文件保存。即使是新手,这似乎也很笨拙。我决定尝试使用逐字字符串将多行文本框保存为单行字符串。不过,我似乎无法弄清楚,因为它似乎将每一行保存到文本文件中的新行中,这破坏了我的加载文件功能。在这种情况下,我是否假设逐字字符串将是要走的路,还是我完全错过了一些东西?

public void SaveCurrentLibrary() {
        SaveFileDialog saveDialog = new SaveFileDialog(); //instantiates a new dialog box
        saveDialog.Filter = "Code Locker File (*.cll)|*.cll|All files (*.*)|*.*";
        saveDialog.InitialDirectory = appDir;

        //ConvertDetailsForSaving(); commented out for testing

        saveDialog.ShowDialog();
        var fileName = saveDialog.FileName;
        MessageBox.Show(fileName);

        System.IO.File.WriteAllLines(fileName, listOfEntries);
        System.IO.File.AppendAllLines(fileName, listOfDetails);
    }

private void LoadLibrary() {

        OpenFileDialog openDialog = new OpenFileDialog();
        openDialog.Filter = "Code Locker Files (*.cll)|*.cll|All files (*.*)|*.*";
        openDialog.InitialDirectory = appDir;

        openDialog.ShowDialog();
        var fileName = openDialog.FileName;

        List<string> lines = new List<string>();
        using (StreamReader r = new StreamReader(fileName)) {
            string line;
            while ((line = r.ReadLine()) != null) {
                if(line.StartsWith("[")) {
                    listOfDetails.Add(line);
                } else {
                    listOfEntries.Add(line);
                    lstEntries.Items.Add(line);
                }
            }
        }
    }

//Function on AddEntry form to send data to main window
private void SendDataToMain() {
        main.lstEntries.Items.Add(txtName.Text); 
        main.listOfEntries.Add(txtName.Text); 
        main.listOfDetails.Add(@"[" + txtName.Text + "]" + txtContents.Text);
        main.lstEntries.SelectedIndex = 0;
        this.Close();
    }

【问题讨论】:

  • “我决定尝试使用逐字字符串将多行文本框保存为单行字符串” 这真的不是逐字字符串。逐字字符串 (@"some\nstring") 是代码编辑器中的一个概念,它告诉编译器将以下字符串视为逐字字符串(不评估转义序列)。
  • @RonBeyer 这就是他想要的文件。这样多行 sn-p 将只占用一行
  • 这正是我所追求的 Keith。今天下班后我得试一试。谢谢。

标签: c# io text-files verbatim-string


【解决方案1】:

您可以将其保存为行,而您的具体问题是您需要自己转义字符串,使用类似Can I convert a C# string value to an escaped string literal

但是从长远来看,您会发现它很棘手,可能更好的方法是使用 Json.Net 将其存储为 json

public class Snippet
{
    public string Code { get; set; }
    public string Name { get; set; }
}

// saving loading
var snippets = new List<Snippet>()
{
    new Snippet(){Name="Saving", Code = "//Code to save\n//to Disk"},
    new Snippet(){Name="Loaidng", Code = "//Code to load\n//from Disk"}
};
var json =  JsonConvert.SerializeObject(snippets);
File.WriteAllText("snippets.json", json);

var loadedSnippets = JsonConvert.DeserializeObject<List<Snippet>>(File.ReadAllText("snippets.json"));
loadedSnippets.ForEach(s => Console.WriteLine(s.Name));

这意味着您将 sn-p 建模为一个概念,然后可以轻松添加其他属性,例如“语言”或创建 sn-p 时的时间戳或其他内容。

它会将它保存到一个看起来像这样的文件中

[{"Code":"//Code to save\n//to Disk","Name":"Saving"},{"Code":"//Code to load\n//from Disk","Name":"Loaidng"}]

【讨论】:

  • 我已经查看了一些 Json 文件,但是在我自学的过程中,有一些概念我还没有完全掌握。这只是一个帮助我学习的宠物项目。一旦我能够深入了解它,我的目标是稍后将数据结构更改为 json。
  • 决定直接加入,效果很好。感谢基思的建议。
  • 如果你想自学更多,下一步就是使用 sqlite(它是单个文件中的数据库)之类的东西,在这种情况下很多东西都会用到它。跨度>
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-02-03
  • 2015-04-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多