locked
Правильно ли я поступил с чтением и записью текстовых файлов? RRS feed

  • Вопрос

  • Я потихоньку в свободное время пишу игровой движок для себя и создания в дальнейшем игр на нем. Задумка "в даль" - стараюсь сделать единый движок для Windows Desktop, Windows Phone 7+, Windows 8 (для магазина).

    У меня есть уже опыт написания простых игр под несколько платформ сразу и в принципе код игровой логики не различается, да и вывода на экран (работы с XAML-элементами). Основная проблема всегда возникала с работой с операционной системой. Везде все по разному делается.

    Собственно встретил затык при Windows 8, как наверное тут многие знают, чтение и запись файлов должно вестись через async\await... А этого то нет в классическом Windows (я хочу, чтобы мои игры работали как минимум под Windows Vista), да и в WP7 не требуется. Все делается довольно классически. В итоге я выделил необходимые функции:

    1) Чтение из файла (открытие потока чтения), расположенного в ресурсах

    2) Чтение из файла (открытие потока чтения), расположенного в хранилище

    3) Запись файлов (открытие потока записи), расположенных в хранилище

    4) Записать строку в поток записи файлов

    5) Прочитать строку из потока чтения

    6) Проверить поток чтения на завершение

    7) Закрытие потока чтения

    8) Закрытие потока записи

    StreamReader ReadFileStream;
            StorageFile FileForLoad;
            StreamWriter WriteFileStream;
            StorageFile FileForWrite;
            
            async void GetReadResourceFile(string filename)
            {            
                ReadFileStream = null;
                FileForLoad = await StorageFile.GetFileFromApplicationUriAsync(new Uri("ms-appx:///" + filename)).AsTask().ConfigureAwait(false);
                ReadFileStream = new StreamReader(await FileForLoad.OpenStreamForReadAsync().ConfigureAwait(false));
            }
            public void ReadResourceFile(string filename)
            {
    
                GetReadResourceFile(filename);
                int cnt=0;
                while (ReadFileStream == null)
                {
                    cnt++;
                }
            }
            async void GetReadFile(string filename)
            {
                ReadFileStream = null;
                FileForLoad = await ApplicationData.Current.LocalFolder.GetFileAsync(filename).AsTask().ConfigureAwait(false);//StorageFile.GetFileFromApplicationUriAsync(new Uri("ms-appx:///" + filename)).AsTask().ConfigureAwait(false);
                ReadFileStream = new StreamReader(await FileForLoad.OpenStreamForReadAsync().ConfigureAwait(false));
            }
            public void ReadFile(string filename)
            {
                GetReadFile(filename);
                int cnt = 0;
                while (ReadFileStream == null)
                {
                    cnt++;
                }
            }
            async void GetWriteFile(string filename)
            {
                WriteFileStream = null;
                FileForWrite = await ApplicationData.Current.LocalFolder.CreateFileAsync(filename, CreationCollisionOption.ReplaceExisting).AsTask().ConfigureAwait(false);
                WriteFileStream = new StreamWriter(await FileForWrite.OpenStreamForWriteAsync().ConfigureAwait(false));
            }        
            public void WriteFile(string filename)
            {
                GetWriteFile(filename);
                int cnt = 0;
                while (WriteFileStream == null)
                {
                    cnt++;
                }
            }
           
    
            public string ReadLine()
            {
                return ReadFileStream.ReadLine();
            }
            public bool EndOfReadFile()
            {
                return ReadFileStream.EndOfStream;
            }
    
            public async void WriteLine(string Line)
            {
                await WriteFileStream.WriteAsync(Line).ConfigureAwait(false);
            }
    
            public void CloseReadFile()
            {
                if (ReadFileStream != null)
                    ReadFileStream.Dispose();
            }
            public async void CloseWriteFile()
            {
                if (WriteFileStream != null)
                {
                    await WriteFileStream.FlushAsync().ConfigureAwait(false);
                    WriteFileStream.Dispose();
                }
            }

    Всё работает, но корректно ли я поступил? Или есть более интересное решение? 


    Drazd

    25 декабря 2012 г. 19:33

Ответы

  • Привет.

    Если все работает и все устраивает - то оставляйте без изменений. Единственное что не очень хорошо - то что будет требоваться явно закрывать файл. Обычно люди привыкли с потоками работать через using и соответственно интерфейс IDisposable, может попробовать посмотреть в эту сторону.


    Для связи [mail]

    • Помечено в качестве ответа Abolmasov Dmitry 28 декабря 2012 г. 8:38
    26 декабря 2012 г. 10:33