Операция не разрешена в IsolatedStorageFileStream.ошибка - PullRequest
8 голосов
/ 07 декабря 2011

У меня проблема с изолированным хранилищем.

Это мой код:

List<Notes> data = new List<Notes>();

using (IsolatedStorageFile isoStore = 
         IsolatedStorageFile.GetUserStoreForApplication())
{
  using (IsolatedStorageFileStream isoStream = 
           isoStore.OpenFile("Notes.xml", FileMode.OpenOrCreate))
  {
    XmlSerializer serializer = new XmlSerializer(typeof(List<Notes>));
    data = (List<Notes>)serializer.Deserialize(isoStream);              
  }
}

data.Add(new Notes() { Note = "hai", DT = "Friday" });

return data;

ошибка: операция не разрешена в IsolatedStorageFileStream. в

using (IsolatedStorageFileStream isoStream = 
        isoStore.OpenFile("Notes.xml", FileMode.OpenOrCreate))

Ответы [ 4 ]

16 голосов
/ 07 июля 2012

Обычно это происходит, когда вы выполняете этот блок кода несколько раз одновременно. Вы заканчиваете тем, что заблокировали файл. Итак, вы должны убедиться, что вы включили режимы FileAccess и FileShare в свой конструктор, например так:

using (var isoStream = new IsolatedStorageFileStream("Notes.xml", FileMode.Open, FileAccess.Read, FileShare.Read, isolatedStorage)
{
//...
}

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

private readonly object _readLock = new object();

lock(_readLock)
{
   using (var isoStream = new IsolatedStorageFileStream("Notes.xml", FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.None, isolatedStorage)
   {
        //...
   }
}
0 голосов
/ 17 января 2019

В случае Silverlight это также может произойти, когда полный путь превышает определенный предел символов. Я не смог найти никакой официальной ссылки на это, но, как я уже тестировал на win10 и IE, кажется, что он находится между 115 и 120 символами.

0 голосов
/ 08 июля 2015

Операция не разрешена в IsolatedStorageFileStream.ошибка во время перемещения файла из общего файла в место назначения.Его рабочий

Добавить пространства имен

 using BackgroundProcess.Resources;
 using Microsoft.Phone.BackgroundTransfer;
 using System.IO.IsolatedStorage;

Создать один каталог назначения в изолированном хранилище

 BackgroundTransferRequest transfer;
 using (IsolatedStorageFile isoStore = IsolatedStorageFile.GetUserStoreForApplication())

 {

      if (isoStore.GetDirectoryNames("DestinationFolder").Length == 0)
           isoStore.CreateDirectory("DestinationFolder");

      storage.MoveFile("/shared/transfers/xyzFileName.mp3", "DestinationFolder");

 }

или использовать

 isoStore.MoveFile(transfer.DownloadLocation.OriginalString, "DestinationFolder");

Вместо добавления имени файла в месте назначения добавьте имя папки.

Вы можете воспроизводить мультимедиа, используя следующий код

 try 
 {
      string isoFileName = "DestinationFolder//xyzFileName.mp3";

      StorageFile file = null;

      try
      {
           file = await Windows.Storage.StorageFile.GetFileFromApplicationUriAsync(new Uri("ms-appdata:///local/" + isoFileName));
      }
      catch (Exception ex)
      {
      }
      if (file != null)
           await Windows.System.Launcher.LaunchFileAsync(file);
  }
  catch (Exception ex)
  {
  }
0 голосов
/ 07 декабря 2011

Замените внутренний оператор using конструктором IsolatedStorageFileStream:

using ( var isoStream = new IsolatedStorageFileStream( "Notes.xml", FileMode.Open, isoStore ) )

Кроме того, поскольку вы читаете из файла, я предполагаю, что нужный вам FileMode - Open, а не OpenOrCreate.

А где назначены «данные», рассмотрите возможность использования

serializer.Deserialize( isoStream ) as List<Notes>

вместо этого. См. Пункт 3 в действующем C #, 2-е изд.

...