Операция не разрешена в IsolatedStorageFileStream - PullRequest
2 голосов
/ 15 октября 2011

Я создаю это приложение WP7, которое использует API для видеоигр, чтобы получать статистику чьего-либо персонажа (просто для изучения Silverlight).Он извлекает сведения об игроках из веб-службы и сохраняет их в изолированном хранилище на телефоне, чтобы снять нагрузку с сервера.

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

В строке 7 он генерирует исключение, говорящее «Операция не разрешена для IsolatedStorageFileStream.», Но только во второй раз, когда он создает экземпляркласс.Я сделал некоторую проверку с отладкой, и он говорит, что файл определенно существует, но он останавливается после второго предложения using.

Может кто-нибудь помочь мне с этим, пожалуйста?Я чувствую, что упускаю что-то действительно очевидное.

public class CacheReader
{
    public PlayerData GetPlayerData(string gamertagIn)
    {
        using (IsolatedStorageFile CachedReachData = IsolatedStorageFile.GetUserStoreForApplication())
        {
            using (IsolatedStorageFileStream stream = CachedReachData.OpenFile(gamertagIn + ".xml", FileMode.Open))
            {
                Debug.WriteLine("Data Retrieved from cache");
                XmlSerializer serializer = new XmlSerializer(typeof(PlayerData));
                PlayerData loadedPlayer = (PlayerData)serializer.Deserialize(stream);
                return loadedPlayer;
            }
        }
    }
}

[EDIT 1] Это трассировка стека, которую я получаю:

at System.IO.IsolatedStorage.IsolatedStorageFileStream..ctor(String path, FileMode mode, FileAccess access, FileShare share, Int32 bufferSize, IsolatedStorageFile isf)
   at System.IO.IsolatedStorage.IsolatedStorageFileStream..ctor(String path, FileMode mode, FileAccess access, IsolatedStorageFile isf)
   at System.IO.IsolatedStorage.IsolatedStorageFile.OpenFile(String path, FileMode mode, FileAccess access)
   at ReachPhoneApp.CacheReader.GetPlayerFromCache(String gamertagIn)
   at ReachPhoneApp.Page2.GetPlayerData()
   at ReachPhoneApp.Page2.cacheWriter_UpdateComplete()
   at ReachPhoneApp.CacheWriter.WritePlayerDataToCache(String fileNameIn, Object objectIn)
   at ReachPhoneApp.CacheWriter.client_GetGameHistoryCompleted(Object sender, GetGameHistoryCompletedEventArgs e)
   at ReachPhoneApp.ReachAPI.ReachApiSoapClient.OnGetGameHistoryCompleted(Object state)
   at System.Reflection.RuntimeMethodInfo.InternalInvoke(RuntimeMethodInfo rtmi, Object obj, BindingFlags invokeAttr, Binder binder, Object parameters, CultureInfo culture, Boolean isBinderDefault, Assembly caller, Boolean verifyAccess, StackCrawlMark& stackMark)
   at System.Reflection.RuntimeMethodInfo.InternalInvoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture, StackCrawlMark& stackMark)
   at System.Reflection.MethodBase.Invoke(Object obj, Object[] parameters)
   at System.Delegate.DynamicInvokeOne(Object[] args)
   at System.MulticastDelegate.DynamicInvokeImpl(Object[] args)
   at System.Delegate.DynamicInvoke(Object[] args)
   at System.Windows.Threading.DispatcherOperation.Invoke()
   at System.Windows.Threading.Dispatcher.Dispatch(DispatcherPriority priority)
   at System.Windows.Threading.Dispatcher.OnInvoke(Object context)
   at System.Windows.Hosting.CallbackCookie.Invoke(Object[] args)
   at System.Windows.Hosting.DelegateWrapper.InternalInvoke(Object[] args)
   at System.Windows.RuntimeHost.ManagedHost.InvokeDelegate(IntPtr pHandle, Int32 nParamCount, ScriptParam[] pParams, ScriptParam& pResult)

Ответы [ 5 ]

5 голосов
/ 01 декабря 2011

Убедитесь, что у вас нет двух потоков, одновременно обращающихся к IsolatedStorage (т. Е. В VS Debug.View.Threads, и убедитесь, что во время исключения у вас нет нескольких путей через один и тот же код IsoStore).).

Это происходило в моем коде WP7 раз в несколько дней, и его было непросто найти, так как казалось, что это происходит только тогда, когда он не подключен к отладчику.

1 голос
/ 06 августа 2013

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

private void SaveStringDataToStorage(string sDirectory, string sFileName, string sFileContent)
    {
        string sPath;
        //            
        using (IsolatedStorageFile oFile = solatedStorageFile.GetUserStoreForApplication())
        {
            if (!oFile.DirectoryExists(sDirectory))
                oFile.CreateDirectory(sDirectory);
            //
            sPath = Path.Combine(sDirectory, sFileName);
            //
            using (var oWriter = new StreamWriter(new IsolatedStorageFileStream(sPath, FileMode.Create, oFile)))
                oWriter.Write(sFileContent);
        }
    }

Использование этого кода будет работать, если у вас возникла та же проблема, что и у меня, плюс он довольно прост, поэтому вы можете адаптировать его к тому, что вам нужно.Я использовал этот код до того, как у меня возникли проблемы, но я забыл !, поэтому каталог так и не был создан, хаха.Просто типично.Надеюсь, это поможет:)

РЕДАКТИРОВАТЬ

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

1 голос
/ 28 февраля 2012

Я думаю, что проблема в том, что вы не указали, что несколько потоков могут читать / писать одновременно, указав System.IO.FileShare.ReadWrite или любой другой доступ, который вам нужен в качестве последнего параметра OpenFile.

См. Обсуждение здесь на форумах Microsoft.

1 голос
/ 19 октября 2011

Вам нужно позвонить:

stream.Close();

до

return loadedPlayer;
0 голосов
/ 14 апреля 2014

По умолчанию, когда вы используете IsolatedStorageFile.OpenFile("filename", FileMode.Open), ваш файл блокируется этим потоком, и ни один другой поток не сможет получить доступ к этому файлу, пока 1-й поток не закроет его.Но если вы хотите поделиться своим файлом в нескольких потоках только для чтения, я бы порекомендовал вам использовать следующие переопределения

IsolatedStorageFile.OpenFile("filename", FileMode.Open, FileAccess.Read, FileShare.Read)

подробности здесь

...