8

我有隔离存储的问题。

这是我的代码:

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

4 回答 4

16

当您同时执行该代码块多次时,通常会发生这种情况。你最终锁定了文件。因此,您必须确保在构造函数中包含 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)
   {
        //...
   }
}
于 2012-07-07T00:12:41.247 回答
0

将内部 using 语句替换为 IsolatedStorageFileStream 构造函数:

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

此外,由于您正在从文件中读取,我假设您想要的 FileMode 是 Open,而不是 OpenOrCreate。

在分配“数据”的地方,考虑使用

serializer.Deserialize( isoStream ) as List<Notes>

反而。请参阅 Effective C#,第 2 版中的第 3 项。

于 2011-12-07T13:51:46.983 回答
0

在 Silverlight 的情况下,当完整路径超过某个字符限制时也会发生这种情况。我找不到任何官方参考,但正如我在 win10 和 IE 上测试过的,它似乎在 115 到 120 个字符之间。

于 2019-01-17T10:56:18.800 回答
-1

不允许对 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)
  {
  }
于 2015-07-08T06:12:16.460 回答