locked
Ошибка открытия потока для чтения файла RRS feed

  • Вопрос

  • Приложение скачивает XML'ку с сайта и сохраняет локально в папке приложения

    Другой поток открывает этот файл и читает его. Проблема при открытии потока чтения файла. Приложение падает с ошибкой ACCESS_DENIED

    public static async Task<XDocument> OpenXmlDocumentAsync(string fileName)
            {
                StorageFolder folder = ApplicationData.Current.LocalFolder;
                StorageFile file = await folder.GetFileAsync(fileName);
                if (file == null) return null;
                XDocument xDocument;
                using (var stream = await file.OpenStreamForReadAsync())
                {
                    xDocument = XDocument.Load(stream);
                }
                return xDocument;
            }

    проверка файла на наличие (file == null) проходится успешно. Приложение падает при вызове метода file.OpenStreamForReadAsync()

    Открытие файла производится уже после окончания записи в него информации

    вот вызов методов

    await Friends.DownloadFriendsAsync();
    await ContactsOnline();
    await FeedsDownloadAsync();

    DownloadFriendsAsync скачивает XML и сохраняет локально.

    ContactsOnline открывает этот файл

    FeedsDownloadAsync тоже открывает файл, но до него мы даже не доходим

    Я не понимаю, почему это происходит. Помогите, пожалуйста

    8 октября 2013 г. 18:52

Ответы

  • Желательно ВСЕ операции с файлами проводить с помощью using, что бы высвобождались ресурсу. Бывают конечно единичные случаи, когда поток необходим позже, но это единичные случаи, в Вашем же - используйте using.
    • Помечено в качестве ответа evgeniy.polonskiy 9 октября 2013 г. 17:52
    9 октября 2013 г. 6:33
  • Конечно!

                    using (var stream = await file.OpenStreamForWriteAsync())
                    {
                        xDocument.Save(stream); // сохраняем файл
                    }
    

    • Помечено в качестве ответа evgeniy.polonskiy 9 октября 2013 г. 17:52
    9 октября 2013 г. 6:54

Все ответы

  • Есть подозрение, что при сохранении файла вы не закрываете поток. Можете привести код сохранения файла?
    8 октября 2013 г. 21:19
  • public static async Task<bool> SaveXmlDocumentAsync(XDocument xDocument, string DesiredName)
            {
                try
                {
                    StorageFolder folder = ApplicationData.Current.LocalFolder;
                    StorageFile file = await folder.CreateFileAsync(DesiredName, CreationCollisionOption.ReplaceExisting); // создаем файл в папке приложения
    
                    xDocument.Save(await file.OpenStreamForWriteAsync()); // сохраняем файл
                    return true;
                }
                catch
                {
                    return false;
                }
            }
    думаете, стоит using запихнуть?
    9 октября 2013 г. 5:40
  • Желательно ВСЕ операции с файлами проводить с помощью using, что бы высвобождались ресурсу. Бывают конечно единичные случаи, когда поток необходим позже, но это единичные случаи, в Вашем же - используйте using.
    • Помечено в качестве ответа evgeniy.polonskiy 9 октября 2013 г. 17:52
    9 октября 2013 г. 6:33
  • Конечно!

                    using (var stream = await file.OpenStreamForWriteAsync())
                    {
                        xDocument.Save(stream); // сохраняем файл
                    }
    

    • Помечено в качестве ответа evgeniy.polonskiy 9 октября 2013 г. 17:52
    9 октября 2013 г. 6:54