IsolatedStorageFileStreamで許可されていない操作。エラー
-
29-10-2019 - |
質問
孤立したストレージに問題があります。
これは私のコードです:
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))
解決
これは通常、そのコードブロックを同時に数回実行すると発生します。ファイルをロックすることになります。したがって、このようなコンストラクターに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)
{
//...
}
}
他のヒント
Statementを使用して内側をInsolatedStorageFileStreamコンストラクターに置き換えます。
using ( var isoStream = new IsolatedStorageFileStream( "Notes.xml", FileMode.Open, isoStore ) )
また、あなたはファイルから読んでいるので、私はあなたが望むFileModeが開いているのではなく、開いていると仮定します。
「データ」が割り当てられる場所は、使用することを検討してください
serializer.Deserialize( isoStream ) as List<Notes>
代わりは。効果的なC#、第2版のアイテム3を参照してください。
Silverlightの場合、フルパスが特定の文字制限を超えた場合にも発生する可能性があります。これについては公式の参照を見つけることができませんでしたが、Win10とIEでテストしたように、115〜120のチャーのどこかにあるようです。
IsolatedStorageFileStreamで許可されていない操作。共有Filetoの宛先からファイルを移動した時点でのエラー。その動作
名前空間を追加します
using BackgroundProcess.Resources;
using Microsoft.Phone.BackgroundTransfer;
using System.IO.IsolatedStorage;
孤立したストレージで1つの宛先ディレクトリを作成します
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)
{
}
所属していません StackOverflow