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はOpenOrCreateではなくOpenであると想定しています。

そして、「データ」が割り当てられている場合は、使用を検討してください

serializer.Deserialize( isoStream ) as List<Notes>

代わりは。効果的な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;

分離ストレージに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)
  {
  }
于 2015-07-08T06:12:16.460 に答える