简体   繁体   English

将数据保存到C#文件中

[英]Saving data to a file in C#

So i am currently working on a project to make an automated Character Sheet for the Pathfinder Roleplaying Game, and am at a loss as to how to save the data. 因此,我目前正在从事一个为Pathfinder Roleplaying Game制作自动化角色表的项目,并且对如何保存数据一无所知。 I want to save the current value of all my variables to a file with the extension .pfcsheet and open it later. 我想将所有变量的当前值保存到扩展名为.pfcsheet的文件中,然后再将其打开。 I've googled around and can not find something that says how to do this, just how to save the contents of a text box. 我四处搜寻,找不到说明如何执行此操作的方法,只是如何保存文本框的内容。 I tried using the saveFileDialog control but it keeps giving me a "file name is not valid" error and nobody seems to know why. 我尝试使用saveFileDialog控件,但它一直显示“文件名无效”错误,似乎没人知道原因。

I just wrote a blog post on saving an object's data to Binary, XML, or Json . 我刚刚写了一篇有关将对象的数据保存到Binary,XML或Json的博客文章 It sounds like you probably want to use Binary serialization, but perhaps you want the files to be edited outside of your app, in which case XML or Json might be better. 听起来您可能想要使用二进制序列化,但是也许您希望在应用程序外部编辑文件,在这种情况下,XML或Json可能更好。 Here are the functions to do it in the various formats. 以下是各种格式的功能。 See my blog post for more details. 有关更多详细信息,请参见我的博客文章。

Binary 二元

/// <summary>
/// Writes the given object instance to a binary file.
/// <para>Object type (and all child types) must be decorated with the [Serializable] attribute.</para>
/// <para>To prevent a variable from being serialized, decorate it with the [NonSerialized] attribute; cannot be applied to properties.</para>
/// </summary>
/// <typeparam name="T">The type of object being written to the XML file.</typeparam>
/// <param name="filePath">The file path to write the object instance to.</param>
/// <param name="objectToWrite">The object instance to write to the XML file.</param>
/// <param name="append">If false the file will be overwritten if it already exists. If true the contents will be appended to the file.</param>
public static void WriteToBinaryFile<T>(string filePath, T objectToWrite, bool append = false)
{
    using (Stream stream = File.Open(filePath, append ? FileMode.Append : FileMode.Create))
    {
        var binaryFormatter = new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter();
        binaryFormatter.Serialize(stream, objectToWrite);
    }
}

/// <summary>
/// Reads an object instance from a binary file.
/// </summary>
/// <typeparam name="T">The type of object to read from the XML.</typeparam>
/// <param name="filePath">The file path to read the object instance from.</param>
/// <returns>Returns a new instance of the object read from the binary file.</returns>
public static T ReadFromBinaryFile<T>(string filePath)
{
    using (Stream stream = File.Open(filePath, FileMode.Open))
    {
        var binaryFormatter = new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter();
        return (T)binaryFormatter.Deserialize(stream);
    }
}

XML XML格式

Requires the System.Xml assembly to be included in your project. 需要将System.Xml程序集包含在您的项目中。

/// <summary>
/// Writes the given object instance to an XML file.
/// <para>Only Public properties and variables will be written to the file. These can be any type though, even other classes.</para>
/// <para>If there are public properties/variables that you do not want written to the file, decorate them with the [XmlIgnore] attribute.</para>
/// <para>Object type must have a parameterless constructor.</para>
/// </summary>
/// <typeparam name="T">The type of object being written to the file.</typeparam>
/// <param name="filePath">The file path to write the object instance to.</param>
/// <param name="objectToWrite">The object instance to write to the file.</param>
/// <param name="append">If false the file will be overwritten if it already exists. If true the contents will be appended to the file.</param>
public static void WriteToXmlFile<T>(string filePath, T objectToWrite, bool append = false) where T : new()
{
    TextWriter writer = null;
    try
    {
        var serializer = new XmlSerializer(typeof(T));
        writer = new StreamWriter(filePath, append);
        serializer.Serialize(writer, objectToWrite);
    }
    finally
    {
        if (writer != null)
            writer.Close();
    }
}

/// <summary>
/// Reads an object instance from an XML file.
/// <para>Object type must have a parameterless constructor.</para>
/// </summary>
/// <typeparam name="T">The type of object to read from the file.</typeparam>
/// <param name="filePath">The file path to read the object instance from.</param>
/// <returns>Returns a new instance of the object read from the XML file.</returns>
public static T ReadFromXmlFile<T>(string filePath) where T : new()
{
    TextReader reader = null;
    try
    {
        var serializer = new XmlSerializer(typeof(T));
        reader = new StreamReader(filePath);
        return (T)serializer.Deserialize(reader);
    }
    finally
    {
        if (reader != null)
            reader.Close();
    }
}

Json 杰森

You must include a reference to Newtonsoft.Json assembly, which can be obtained from the Json.NET NuGet Package . 您必须包括对Newtonsoft.Json程序集的引用,该引用可以从Json.NET NuGet Package获得

/// <summary>
/// Writes the given object instance to a Json file.
/// <para>Object type must have a parameterless constructor.</para>
/// <para>Only Public properties and variables will be written to the file. These can be any type though, even other classes.</para>
/// <para>If there are public properties/variables that you do not want written to the file, decorate them with the [JsonIgnore] attribute.</para>
/// </summary>
/// <typeparam name="T">The type of object being written to the file.</typeparam>
/// <param name="filePath">The file path to write the object instance to.</param>
/// <param name="objectToWrite">The object instance to write to the file.</param>
/// <param name="append">If false the file will be overwritten if it already exists. If true the contents will be appended to the file.</param>
public static void WriteToJsonFile<T>(string filePath, T objectToWrite, bool append = false) where T : new()
{
    TextWriter writer = null;
    try
    {
        var contentsToWriteToFile = JsonConvert.SerializeObject(objectToWrite);
        writer = new StreamWriter(filePath, append);
        writer.Write(contentsToWriteToFile);
    }
    finally
    {
        if (writer != null)
            writer.Close();
    }
}

/// <summary>
/// Reads an object instance from an Json file.
/// <para>Object type must have a parameterless constructor.</para>
/// </summary>
/// <typeparam name="T">The type of object to read from the file.</typeparam>
/// <param name="filePath">The file path to read the object instance from.</param>
/// <returns>Returns a new instance of the object read from the Json file.</returns>
public static T ReadFromJsonFile<T>(string filePath) where T : new()
{
    TextReader reader = null;
    try
    {
        reader = new StreamReader(filePath);
        var fileContents = reader.ReadToEnd();
        return JsonConvert.DeserializeObject<T>(fileContents);
    }
    finally
    {
        if (reader != null)
            reader.Close();
    }
}

Example

// To save the characterSheet variable contents to a file.
WriteToBinaryFile<CharacterSheet>("C:\CharacterSheet.pfcsheet", characterSheet);

// To load the file contents back into a variable.
CharacterSheet characterSheet = ReadFromBinaryFile<CharacterSheet>("C:\CharacterSheet.pfcsheet");

I think you might want something like this 我想你可能想要这样的东西

// Compose a string that consists of three lines.
string lines = "First line.\r\nSecond line.\r\nThird line.";

// Write the string to a file.
System.IO.StreamWriter file = new System.IO.StreamWriter("c:\\test.txt");
file.WriteLine(lines);

file.Close();

Look into the XMLSerializer class. 查看XMLSerializer类。

If you want to save the state of objects and be able to recreate them easily at another time, serialization is your best bet. 如果要保存对象的状态并能够在其他时间轻松地重新创建它们,那么序列化是最好的选择。

Serialize it so you are returned the fully-formed XML. 序列化它,以便您返回完整的XML。 Write this to a file using the StreamWriter class. 使用StreamWriter类将此内容写入文件。

Later, you can read in the contents of your file, and pass it to the serializer class along with an instance of the object you want to populate, and the serializer will take care of deserializing as well. 以后,您可以读入文件的内容,并将其与要填充的对象的实例一起传递给序列化器类,序列化器还将负责反序列化。

Here's a code snippet taken from Microsoft Support : 这是来自Microsoft支持的代码段:

using System;

public class clsPerson
{
  public  string FirstName;
  public  string MI;
  public  string LastName;
}

class class1
{ 
   static void Main(string[] args)
   {
      clsPerson p=new clsPerson();
      p.FirstName = "Jeff";
      p.MI = "A";
      p.LastName = "Price";
      System.Xml.Serialization.XmlSerializer x = new System.Xml.Serialization.XmlSerializer(p.GetType());

      // at this step, instead of passing Console.Out, you can pass in a 
      // Streamwriter to write the contents to a file of your choosing.
      x.Serialize(Console.Out, p);


      Console.WriteLine();
      Console.ReadLine();
   }
} 

Here is a simple example similar to Sachin's. 这是一个类似于Sachin的简单示例。 It's recommended to use a "using" statement on the unmanaged file resource: 建议在非托管文件资源上使用“ using”语句:

        // using System.IO;
        string filepath = @"C:\test.txt";
        using (StreamWriter writer = new StreamWriter(filepath))
        {
            writer.WriteLine("some text");
        }

using Statement (C# Reference) 使用语句(C#参考)

Here's an article from MSDN on a guide for how to write text to a file: 这是MSDN上有关如何将文本写入文件的指南的文章:

http://msdn.microsoft.com/en-us/library/8bh11f1k.aspx http://msdn.microsoft.com/zh-CN/library/8bh11f1k.aspx

I'd start there, then post additional, more specific questions as you continue your development. 我将从这里开始,然后在继续开发时发布其他更具体的问题。

Starting with the System.IO namespace (particularly the File or FileInfo objects) should get you started. 从System.IO命名空间(尤其是File或FileInfo对象)开始应该可以入门。

http://msdn.microsoft.com/en-us/library/system.io.file.aspx http://msdn.microsoft.com/en-us/library/system.io.file.aspx

http://msdn.microsoft.com/en-us/library/system.io.fileinfo.aspx http://msdn.microsoft.com/zh-CN/library/system.io.fileinfo.aspx

One liner: 一班轮:

System.IO.File.WriteAllText(@"D:\file.txt", content);

It creates the file if it doesn't exist and overwrites it if it exists. 如果文件不存在,它将创建文件;如果文件存在,则将覆盖文件。 Make sure you have appropriate privileges to write to the location, otherwise you will get an exception. 确保您具有写该位置的适当特权,否则您将获得异常。

https://msdn.microsoft.com/en-us/library/ms143375%28v=vs.110%29.aspx?f=255&MSPPError=-2147217396 https://msdn.microsoft.com/zh-cn/library/ms143375%28v=vs.110%29.aspx?f=255&MSPPError=-2147217396

Write string to text file and ensure it always overwrites the existing content. 将字符串写入文本文件,并确保它始终覆盖现有内容。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM