Opération non autorisée sur IsolatedStorageFileStream.Erreur
-
29-10-2019 - |
Question
J'ai un problème avec le stockage isolé.
Voici mon code:
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;
l'erreur: opération non autorisée sur IsolatedStorageFileStream.dans
using (IsolatedStorageFileStream isoStream =
isoStore.OpenFile("Notes.xml", FileMode.OpenOrCreate))
La solution
Cela se produit généralement lorsque vous exécutez ce bloc de code plusieurs fois simultanément.Vous finissez par verrouiller le fichier.Donc, vous devez vous assurer que vous incluez les modes FileAccess et FileShare dans votre constructeur comme ceci:
using (var isoStream = new IsolatedStorageFileStream("Notes.xml", FileMode.Open, FileAccess.Read, FileShare.Read, isolatedStorage)
{
//...
}
Si vous voulez écrire dans le fichier pendant que d'autres lisent, vous devez synchroniser le verrouillage comme ceci:
private readonly object _readLock = new object();
lock(_readLock)
{
using (var isoStream = new IsolatedStorageFileStream("Notes.xml", FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.None, isolatedStorage)
{
//...
}
}
Autres conseils
Remplacez l'instruction using interne par un constructeur IsolatedStorageFileStream:
using ( var isoStream = new IsolatedStorageFileStream( "Notes.xml", FileMode.Open, isoStore ) )
De plus, puisque vous lisez à partir du fichier, je suppose que le FileMode que vous voulez est Open, pas OpenOrCreate.
Et là où les "données" sont attribuées, pensez à utiliser
serializer.Deserialize( isoStream ) as List<Notes>
à la place.Voir l'élément 3 dans Effective C #, 2e édition.
Dans le cas de Silverlight, cela peut également se produire lorsque le chemin complet dépasse une certaine limite de caractères.Je n'ai pas trouvé de référence officielle à ce sujet, mais comme je l'ai testé sur win10 et IE, il semble se situer entre 115 et 120 caractères.
Opération non autorisée sur IsolatedStorageFileStream.erreur au moment du déplacement du fichier du fichier partagé vers la destination.Son fonctionnement
Ajouter des espaces de noms
using BackgroundProcess.Resources;
using Microsoft.Phone.BackgroundTransfer;
using System.IO.IsolatedStorage;
Créez un répertoire de destination dans un stockage isolé
BackgroundTransferRequest transfer;
using (IsolatedStorageFile isoStore = IsolatedStorageFile.GetUserStoreForApplication())
{
if (isoStore.GetDirectoryNames("DestinationFolder").Length == 0)
isoStore.CreateDirectory("DestinationFolder");
storage.MoveFile("/shared/transfers/xyzFileName.mp3", "DestinationFolder");
}
ou utilisez
isoStore.MoveFile(transfer.DownloadLocation.OriginalString, "DestinationFolder");
Au lieu d'ajouter un nom de fichier dans la destination, ajoutez un nom de dossier.
Vous pouvez lire des fichiers multimédias en utilisant le code suivant
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)
{
}