Моя игра WP7 либо неправильно читает, либо пишет из IsolatedFileStream

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

public void ReadHighScore()
    {
        byte[] myByteArray = new byte[64]; // Creates a new local byte array with a length of 64
        using (var store = IsolatedStorageFile.GetUserStoreForApplication()) // Creates an IsolatedStorageFile within the User Storage
        using (var stream = new IsolatedStorageFileStream("highscore.txt", System.IO.FileMode.Create, System.IO.FileAccess.ReadWrite, store)) // Creates a new filestream attatched to the storage file
        {
            if (stream != null) // Checks to see if the filestream sucessfully read the file
            {
                int streamLength = (int)stream.Length; // Gets the length of the filestream
                stream.Read(myByteArray, 0, streamLength); // Parses the filestream to the byte array
            }
            else
                myState = (int)game_state.Terminate; // Temporary Error checking, the function gets though this without triggering the 'terminate' gamestate
        }

        string ScoreString = myByteArray.ToString(); // Parses the byte array to a string
        Int32.TryParse(ScoreString, out highScore.score); // Parses the string to an integer
    }

    public void SaveHighScore()
    {
        byte[] myByteArray = new byte[64]; // Creates a new local byte array with a length of 64
        using (var store = IsolatedStorageFile.GetUserStoreForApplication()) // Creates an IsolatedStorageFile within the User Storage
        using (var stream = new IsolatedStorageFileStream("highscore.txt", System.IO.FileMode.Create, System.IO.FileAccess.ReadWrite, store)) // Creates a new filestream attatched to the storage file
        {
            if (stream != null) // Checks to see if the filestream sucessfully read the file
            {
                int streamLength = (int)stream.Length; // Gets the length of the filestream
                stream.Write(myByteArray, 0, streamLength); // Parses the byte array to the filestream
            }
            else
                myState = (int)game_state.Terminate; // Temporary Error checking, the function gets though this without triggering the 'terminate' gamestate
        }
    }
}

1 ответ

Решение

Во-первых, в части чтения есть ошибка: вы открываете файл с помощью FileMode.Create,

И согласно документации:

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

Так что в основном ваш ReadHighScore удаляет старый файл и создает новый. Что, я считаю, не то, что вы хотели сделать. замещать FileMode.Create от FileMode.OpenOrCreate (только в ReadHighScore метод), и вы должны иметь лучший результат.


Кроме того, есть ошибка в SaveHighScoreна этой линии:

stream.Write(myByteArray, 0, streamLength);

Так как вы создаете файл, streamLength должен быть равен 0. Следовательно, вы ничего не пишете. Что вы действительно хотите сделать, это:

stream.Write(myByteArray, 0, myByteArray.Length);

Вы должны рассмотреть возможность использования StreamReader, StreamWriter, BinaryReader, а также BinaryWriter для чтения / записи в потоки, так как они гораздо проще в использовании.


И последнее, но не менее важное: данные, которые вы читаете и пишете, неверны. в SaveHighScore метод, вы пытаетесь сохранить пустой массив, фактический высокий балл нигде не найти. в ReadHighScore метод, это еще хуже: ты читаешь myByteArray.ToString(), который всегда будет равен System.Byte[],


В конце ваш код должен выглядеть примерно так: (highScore.score объявлен как int)

public void ReadHighScore()
{
    using (var store = IsolatedStorageFile.GetUserStoreForApplication())
    {
        using (var stream = new IsolatedStorageFileStream("highscore.txt", System.IO.FileMode.OpenOrCreate, System.IO.FileAccess.Read, store))
        {
            using (var reader = new BinaryReader(stream))
            {
                highScore.score = reader.ReadInt32();
            }
        }
    }
}

public void SaveHighScore()
{
    using (var store = IsolatedStorageFile.GetUserStoreForApplication())
    {
        using (var stream = new IsolatedStorageFileStream("highscore.txt", System.IO.FileMode.Create, System.IO.FileAccess.ReadWrite, store))
        {
            using (var writer = new BinaryWriter(stream))
            {
                writer.Write(highScore.score);
            }
        }
    }
}
Другие вопросы по тегам