Member 14614998 Ответов: 2

Мое приложение выходит из строя, когда я запускаю его в первый раз! (Сохранять файлы)


Моя программа выходит из строя, когда я запускаю ее в первый раз, и у меня нет созданного файла, и я пытаюсь создать его в приложении.

string folderName = @"c:\consoleRace";
string saveFile = "saveFile.txt";

System.IO.Directory.CreateDirectory(folderName);

string filePath = System.IO.Path.Combine(folderName, saveFile);

if (!File.Exists(filePath))
{
    File.Create(filePath);
    List<string> output = new List<string>();
    output.Add($"{Person.name},{Person.carName},{Person.carMaxSpeed},{Person.coins}");
    File.WriteAllLines(filePath, output);
}
List<string> lines = File.ReadAllLines(filePath).ToList();

foreach (var line in lines)
{
    string[] saveInfo = line.Split(',');
    Person player = new Person();

    Person.name = saveInfo[0];
    Person.carName = saveInfo[1];
    Person.carMaxSpeed = int.Parse(saveInfo[2]);
    Person.coins = int.Parse(saveInfo[3]);
}



Я думаю, что он падает на выделенной жирным шрифтом части, и я получаю сообщение об ошибке, говорящее, что он используется в другой программе. В любом случае, я могу это исправить? (это консольное приложение)

Что я уже пробовал:

Я не знаю, что я могу попробовать. Так что, если кто-нибудь сможет объяснить.

2 Ответов

Рейтинг:
16

phil.o

Вам не нужно создавать файл перед использованием WriteAllLines.
Вполне возможно, что вы столкнетесь с гоночным состоянием, используя WriteAllLines сразу после этого Create.
Ты можешь попробовать:

if (!File.Exists(filePath))
{
   List<string> output = new List<string>();
   output.Add($"{Person.name},{Person.carName},{Person.carMaxSpeed},{Person.coins}");
   File.WriteAllLines(filePath, output);
}


[Edit] еще несколько уточнений:
Обычно вы используете File.Create когда вы хотите получить FileStream объект (который является возвращаемым типом объекта Create метод), который вы повторно используете позже в своем коде. Когда вы это сделаете, будет хорошей идеей использовать его в using блокируйте, чтобы системные ресурсы были правильно распределены в конце.
using (FileStream stream = File.Create(...))
{
   // Do something with the stream
}

В то время как File.WriteAllLines ничего не возвращает, он просто открывает или создает файл, записывает в него, а затем закрывает его.

Надеюсь, это имеет смысл.


Рейтинг:
0

OriginalGriff

Мы не можем сказать, потому что мы не можем запустить ваш код при тех же обстоятельствах, что и вы - лично я бы начал с просмотра сообщения об ошибке, когда оно выходит из строя, и понял, почему оно говорит, что есть проблема. Я бы предположил, что это, вероятно, связано с переменной Person, и это контент, который, возможно, null

Так что все будет зависеть от тебя.
К счастью, у вас есть инструмент, который поможет вам выяснить, что происходит: отладчик. Если вы не знаете, как его использовать, то быстрый Google для "Visual Studio debugger" должен дать вам необходимую информацию.

Поместите точку останова в первую строку функции и запустите код через отладчик. Затем посмотрите на свой код и на свои данные и определите, что должно произойти вручную. Затем по одному шагу в каждой строке проверяйте, что то, что вы ожидали, произойдет именно так, как и произошло. Когда это не так, тогда у вас есть проблема, и вы можете вернуться назад (или запустить ее снова и посмотреть более внимательно), чтобы выяснить, почему.

Извините, но мы не можем сделать это за вас - пришло время вам освоить новый (и очень, очень полезный) навык: отладку!