我遇到隔离存储问题。
这是我的代码:
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))
答案 0 :(得分: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)
{
//...
}
}
答案 1 :(得分:0)
将内部using语句替换为IsolatedStorageFileStream构造函数:
using ( var isoStream = new IsolatedStorageFileStream( "Notes.xml", FileMode.Open, isoStore ) )
此外,由于您正在从文件中读取数据,因此我假设您想要的FileMode是Open,而不是OpenOrCreate。
在哪里&#39;数据&#39;已分配,请考虑使用
serializer.Deserialize( isoStream ) as List<Notes>
代替。见有效C#中的第3项,第2版。
答案 2 :(得分:0)
对于Silverlight,当完整路径超过某个字符限制时,也可能发生这种情况。我找不到任何官方参考,但是正如我在win10和IE上测试过的那样,它似乎介于115到120个字符之间。
答案 3 :(得分:-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");
而不是在目的地添加文件名添加foldername。
您可以使用以下代码播放媒体
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)
{
}