Ошибка при попытке записать образ в изолированное хранилище в WP7 Mango - PullRequest
1 голос
/ 13 сентября 2011

Здесь я прилагаю фрагмент кода.

Ошибка: An error occurred while accessing IsolatedStorage.

public Boolean SaveImage(string filename, WriteableBitmap wrtbmp)
{
    try
    {
        using (IsolatedStorageFile iSF = IsolatedStorageFile.GetUserStoreForApplication())
        {
            if (iSF.FileExists(filename))
            {
                iSF.DeleteFile(filename);
            }
            using (IsolatedStorageFileStream fstream = new IsolatedStorageFileStream(filename, FileMode.CreateNew, FileAccess.Write, iSF))
            {
                wrtbmp.SaveJpeg(fstream, wrtbmp.PixelWidth, wrtbmp.PixelHeight, 0, 100);
                fstream.Close();
                fstream.Dispose();
            }
        }
    }
    catch (Exception ex)
    {
        if (System.Diagnostics.Debugger.IsAttached)
        {
            System.Diagnostics.Debugger.Break();
        }
        return false;
    }

    return true;
}

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

Ответы [ 2 ]

1 голос
/ 13 сентября 2011

Трассировка стека указывает на DeleteFile . Вы уверены, что путь для удаления действителен? Вы уверены, что файл существует? Я плохо помню, но я думаю, что файл Delete может выдать, если файл не найден - пожалуйста, проверьте пример в связанном описании метода MSDN - там есть IF-существует. [РЕДАКТИРОВАТЬ: Извините, сегодня я немного устал, и я не прочитал ваш код должным образом. Очевидно, ваш код уже защищен от отсутствия файлов.]

Помимо возможной проблемы небытия, существует небольшая вероятность того, что здесь, но где-то еще в вашем коде есть что-то, что открыло файл и не закрыло его должным образом. В таком случае система будет считать, что файл используется (даже если этот «старый» дескриптор, открытый в другом месте, «забыт» и ожидает, пока его не скопирует GC), и никакие операции над этим файлом не будут успешными, если этот дескриптор фактически умирает.

Другое дело, что даже если вы используете / autodispose, операция все равно может завершиться неудачей, если вы попытаетесь вызвать метод несколько раз одновременно из разных потоков. С асинхронными шаблонами иногда бывает трудно заметить - тщательно проверьте, из каких точек кода вызывается этот метод, и подумайте, может ли это произойти, т.е. что в то же время обратный вызов GUI вызовет его, и, возможно, также некоторую фоновую операцию? Если это так, попробуйте обернуть использование дополнительно оператором блокировки. Если это помогает, это означает, что у вас есть проблемы с повторным входом.

edit: кто-то, в какой-то момент в далеком будущем, убьет меня за сотни правок ... но я все равно напишу :): Я думаю, что в общем случае вам не нужно удалять файл перед записью в Это. CreateFile не единственный, кто получает доступ к файлам. Проверьте OpenFile с mode = OpenOrCreate | Сократить или еще короче: mode = Create (см. Объяснения FileMode )

1 голос
/ 13 сентября 2011

Во-первых, нет необходимости вызывать fstream.Close(); и fstream.Dispose();, когда вы используете оператор using, который автоматически закрывает и удаляет поток.

Во-вторых, ваша ошибка нене достаточно ясно.

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