Saving/loading 文本文件的逐字字符串
Saving/loading a verbatim string to a text file
我的编码之旅已经一个月左右了,目前我正在编写我的第一个程序。它允许将代码片段保存和组织到一个易于搜索的库中。
Screenshot
我目前使用两个列表来存储数据(一个用于条目名称,另一个用于条目内容),我已经能够通过向 EACH 添加标签来保存和加载到文本文件明细行已保存。即使作为新手,这看起来也很笨拙。我决定尝试使用逐字字符串将多行文本框保存为单行字符串。我似乎无法弄清楚,因为它似乎将每一行保存到文本文件中的一个新行,这破坏了我的加载文件功能。在这种情况下,我是假设逐字字符串是可行的方法,还是我完全遗漏了什么?
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();
}
你可以将它保存为行,你的具体问题是你需要自己转义你的字符串,使用类似 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));
这意味着您将代码段建模为一个概念,然后可以轻松添加其他属性,例如 "language" 或制作代码段时的时间戳,或其他内容。
它将把它保存到一个看起来像
的文件中
[{"Code":"//Code to save\n//to Disk","Name":"Saving"},{"Code":"//Code to load\n//from Disk","Name":"Loaidng"}]
我的编码之旅已经一个月左右了,目前我正在编写我的第一个程序。它允许将代码片段保存和组织到一个易于搜索的库中。 Screenshot
我目前使用两个列表来存储数据(一个用于条目名称,另一个用于条目内容),我已经能够通过向 EACH 添加标签来保存和加载到文本文件明细行已保存。即使作为新手,这看起来也很笨拙。我决定尝试使用逐字字符串将多行文本框保存为单行字符串。我似乎无法弄清楚,因为它似乎将每一行保存到文本文件中的一个新行,这破坏了我的加载文件功能。在这种情况下,我是假设逐字字符串是可行的方法,还是我完全遗漏了什么?
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();
}
你可以将它保存为行,你的具体问题是你需要自己转义你的字符串,使用类似 Can I convert a C# string value to an escaped string literal
但是您会发现长期使用它很棘手,可能更好的方法是使用 Json.Net
将其存储为 jsonpublic 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));
这意味着您将代码段建模为一个概念,然后可以轻松添加其他属性,例如 "language" 或制作代码段时的时间戳,或其他内容。
它将把它保存到一个看起来像
的文件中[{"Code":"//Code to save\n//to Disk","Name":"Saving"},{"Code":"//Code to load\n//from Disk","Name":"Loaidng"}]