繁体   English   中英

在 C# (Unity) 中关闭文件

[英]Closing a file in C# (Unity)

我试图弄清楚如何处理文件,但由于不同方法的数量,我感到困惑。

我已经使用了当前写入文件的方式。 到目前为止它似乎工作正常,但我想知道是否必须在用户退出游戏时添加一个文件关闭? 另一个问题是为什么在不使用 File.Create() 的情况下创建文件?

if (!File.Exists(path))
        {

            File.WriteAllText(path, "Date\t\t| ROM \t\t| Left Hand | Right Hand |\n");
        } 

附上整个代码:

public class SavingData : MonoBehaviour
{
    public static string path = @"C:\users\Desktop\Game1.txt";
    void Start()
    {
        CreateFile();
    }

    void CreateFile()
    {
        if (!File.Exists(path))
        {

            File.WriteAllText(path, "Date\t\t| ROM \t\t| Left Hand | Right Hand |\n");
        }
        else
        {
            string date = "Login date: " + System.DateTime.Now + "\n";
            File.AppendAllText(path, date);
        }
    }

    public static void WriteToFile()
    {
        File.AppendAllText(path, "hellow\n");
    }
    public static void CloseFile()
    {
    }
} 

File.WriteAllText文档指出:

创建一个新文件,将指定的字符串写入文件,然后关闭文件。 如果目标文件已经存在,它会被覆盖。

所以这个单一的方法可以完成您认为没有做的所有事情 - 创建文件并关闭它。

如果您想手动关闭文件,请不要使用File.WriteAllTextFile.AppendAllText 使用另一种写入文件的方式,例如StreamWriter

如果我必须使用StreamWriter这就是我会写的。

public class SavingData : MonoBehaviour
{
    public string path = @"C:\users\Desktop\Game1.txt";
    private StreamWriter writer;
    void Start()
    {
        CreateFile();
    }

    void CreateFile()
    {
        writer = new StreamWriter(path, true);
        if (!File.Exists(path))
        {

            writer.WriteLine("Date\t\t| ROM \t\t| Left Hand | Right Hand |\n");
        }
        else
        {
            string date = "Login date: " + System.DateTime.Now + "\n";
            writer.WriteLine(date);
        }
    }

    public void WriteToFile()
    {
        writer.WriteLine("hellow\n");
    }
    public void CloseFile()
    {
        writer.Close();
    }
} 

实际上,如果您想要更多控制,则需要使用FileStream 它在写入文件时为您提供更多控制。 它允许您保持文件句柄打开并仅写入数据而无需任何其他控制。

但是FileStream也有一些缺点。

从文档

当 FileStream 对象在其句柄上没有独占保留时,另一个线程可以同时访问文件句柄并更改与文件句柄关联的操作系统文件指针的位置。 在这种情况下,FileStream 对象中的缓存位置和缓冲区中的缓存数据可能会受到损害。 FileStream 对象会例行检查访问缓存缓冲区的方法,以确保操作系统的句柄位置与 FileStream 对象使用的缓存位置相同。

另一方面 :

System.IO.File 包含文件操作的包装器,用于基本操作,例如保存文件、读取文件到行等。它只是对 FileStream 的抽象。

所以 WriteAllText 是对创建、保存和关闭并自动执行的抽象,您不需要知道每个实现。

所以你的问题的基本答案是: NO ,你不需要手动关闭文件,它会自动关闭。

暂无
暂无

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

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