Закрытие файла в C# (Unity) - PullRequest
       3

Закрытие файла в C# (Unity)

0 голосов
/ 01 марта 2020

Я пытаюсь понять, как работать с файлами, и я запутался из-за большого количества различных методов.

Я использовал текущий способ записи в файл. Пока все работает нормально, но мне интересно, нужно ли мне добавлять закрытие файла, когда пользователь выходит из игры? Еще один вопрос: почему файл создается без использования 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()
    {
    }
} 

Ответы [ 2 ]

2 голосов
/ 01 марта 2020

Документация из File.WriteAllText гласит:

Создает новый файл, записывает указанную строку в файл и затем закрывает файл. Если целевой файл уже существует, он перезаписывается.

Таким образом, этот единственный метод выполняет все то, что, как вы думали, вы не делали - создает файл и закрывает его.

Если вы хотите закрыть файл вручную, не используйте File.WriteAllText и File.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();
    }
} 
1 голос
/ 01 марта 2020

На самом деле, если вы хотите больше контроля, вам нужно использовать FileStream . Это дает вам больше контроля при записи в файлы. Это позволяет держать дескриптор файла открытым и просто записывать данные без какого-либо дополнительного контроля.

Но FileStream также имеет некоторые недостатки.

Из документации

Когда объект FileStream не имеет исключительного удержания на своем дескрипторе, другой поток может одновременно получить доступ к дескриптору файла и изменить позицию указатель файла операционной системы, связанный с дескриптором файла. В этом случае кэшированная позиция в объекте FileStream и кэшированные данные в буфере могут быть скомпрометированы. Объект FileStream регулярно выполняет проверки методов, которые обращаются к кэшированному буферу, чтобы убедиться, что позиция дескриптора операционной системы совпадает с позицией в кэше, используемой объектом FileStream.

С другой стороны:

System.IO.File содержит обертки вокруг файловых операций для базовых c действий, таких как сохранение файла, чтение файла в строки и т. Д. c. Это просто абстракция над FileStream.

Так что WriteAllText - это абстракция для создания, сохранения и закрытия и автоматического выполнения этого, и вам не нужно знать каждую из реализаций.

Итак базовый c ответ на ваш вопрос: NO , вам не нужно вручную закрывать файл, он сделает это автоматически.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...