Nii Laryea
Nii Laryea

Reputation: 1221

Operation not permitted on IsolatedStorageFileStream in WP8

I have seen numerous similar questions and I have really tried all the solutions but none seems to work for me.

This is what I have now:

        private readonly object _lock = new object();
        List<DataModel> dataList = new List<DataModel>();

        lock (_lock)
        {
            using (IsolatedStorageFile myIsolatedStorage = IsolatedStorageFile.GetUserStoreForApplication())
            {
                try
                {
                    using (IsolatedStorageFileStream stream = myIsolatedStorage.OpenFile("Data.xml", FileMode.Open, FileAccess.ReadWrite, FileShare.ReadWrite))
                    {
                        XmlSerializer serializer = new XmlSerializer(typeof(List<DataModel>));
                            dataList = (List<DataModel>)serializer.Deserialize(stream);
                    }
                }
                catch (IsolatedStorageException e) { e.ToString(); }
            }
        }

The error occurs on the line using (IsolatedStorageFileStream stream = myIsolatedStorage.OpenFile("Data.xml", FileMode.Open, FileAccess.ReadWrite, FileShare.ReadWrite)).

I deduced from the other solutions that I read that this error mainly occurs when I want to write to the file while others are reading it or execute that code block several times concurrently, I end up locking the file."

With the presence of the lock, FileAccess.ReadWrite and FileShare.ReadWrite statements, I'm pretty sure something else is throwing that exception.

My question is what could be throwing the exception (IsolatedStorageException) and how do I take care of it?

There is no InnerException on this one.

Edit: Upon Kookiz suggestion, I'm including this code lines

First, I create my .xml file like this:

    public static void createDataXML()
    {
        List<DataModel> dataList = new List<DataModel>();

        using (IsolatedStorageFile myIsolatedStorage = IsolatedStorageFile.GetUserStoreForApplication())
        {
            if (myIsolatedStorage.FileExists("Data.xml"))
            { return; }
            using (IsolatedStorageFileStream stream = myIsolatedStorage.CreateFile("Data.xml"))
            {
                try
                {
                    XmlSerializer serializer = new XmlSerializer(typeof(List<DataModel>));
                    serializer.Serialize(stream, dataList);
                }
                catch
                { }
            }
        }
    }

Later, I populate with this code:

            using (IsolatedStorageFile myIsolatedStorage = IsolatedStorageFile.GetUserStoreForApplication())
            {
                using (IsolatedStorageFileStream stream = myIsolatedStorage.OpenFile("Data.xml", FileMode.Create, FileAccess.ReadWrite, FileShare.ReadWrite))
                {
                    XmlSerializer serializer = new XmlSerializer(typeof(List<DataModel>));
                    using (XmlWriter xmlWriter = XmlWriter.Create(stream, xmlWriterSettings))
                    {
                        serializer.Serialize(xmlWriter, dataList);
                    }
                }
            }

Upvotes: 3

Views: 1279

Answers (2)

Rahul Ranjan
Rahul Ranjan

Reputation: 284

My dear, though this exception of Operation Not Permitted On IsolatedStorage is mainly due to ReadWrite by another thread, in your case it is because of ONE SIMPLE REASON

FileMode.Open throws exception when the filename DOES NOT EXIST

Try with FileMode.OpenOrCreate and it will work like a charm

 List<DataModel> dataList = new List<DataModel>();
         using (IsolatedStorageFile myIsolatedStorage = IsolatedStorageFile.GetUserStoreForApplication())
         {

             using (IsolatedStorageFileStream stream = myIsolatedStorage.OpenFile("Data.xml", FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.ReadWrite))
             {
                 XmlSerializer serializer = new XmlSerializer(typeof(List<DataModel>));
                 dataList = (List<DataModel>)serializer.Deserialize(stream);
             }

        }

Upvotes: 0

DotNetRussell
DotNetRussell

Reputation: 9867

I know this is a less conventional way of doing this but it IS a way. I was attempting to do something else and this was the result. Just add in the known type you need and this will work

[DataContractAttribute]
[KnownType (typeof(List<String>))]
public class SerializableObject
{
   [DataMember]
    public List<String> serFile { get; set; }
}
public static Object GetFile(String FileName)
{
    try
    {
      if (!IsolatedStorageFile.GetUserStoreForApplication().FileExists(FileName))
       {
         throw new System.ArgumentException("File Doesn't Exist In Isoloated Storage");
       }
    }
    catch { return null;  }

    Object ret = new Object();
    try
    {
      IsolatedStorageFile file = IsolatedStorageFile.GetUserStoreForApplication();

      IsolatedStorageFile myIsolatedStorage = IsolatedStorageFile.GetUserStoreForApplication();
      IsolatedStorageFileStream fileStream = myIsolatedStorage.OpenFile(@"\" + FileName, FileMode.Open, FileAccess.Read, FileShare.ReadWrite);


      SerializableObject serList = new SerializableObject();
      DataContractSerializer dsc = new DataContractSerializer(serList.GetType());
      ret = ((SerializableObject)dsc.ReadObject(fileStream)).serFile;
    }
    catch (Exception error) { throw new System.ArgumentException(error.Message); }
    return ret;
}

The implied task here is that you need to serialize it within a SerializableObject instance. Let me know if you need that code also

Edit

As promised, the savefile function

  public static void SaveFile(String FileName, List<String> File)
    {
        try
        {
            if (FileName.Length < 1)
            {
                throw new System.ArgumentException("File Name Must Not Be Empty");
            }
            if (IsolatedStorageFile.GetUserStoreForApplication().AvailableFreeSpace <= 0)
            {
                throw new System.ArgumentException("Isolated Storage Out of Memory - Please free up space.");
            }
            if (IsolatedStorageFile.GetUserStoreForApplication().FileExists(FileName))
            {
                throw new System.ArgumentException("File Already Exists - Please choose a unique name.");
            }
            if (File == null)
            {
                throw new System.ArgumentException("Cannot Save Null Files");
            }
        }
        catch (Exception e)
        {
            return;
        }
        try
        {
            SerializableObject so = new SerializableObject() { serFile = File };
            DataContractSerializer dsc = new DataContractSerializer(so.GetType());

            IsolatedStorageFile file = IsolatedStorageFile.GetUserStoreForApplication();
            StreamWriter writer;

            writer = new StreamWriter(new IsolatedStorageFileStream(FileName, FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.ReadWrite, file));

            dsc.WriteObject(writer.BaseStream, so);
        }
        catch (Exception error) { throw new System.ArgumentException(error.Message); }

    }

Enjoy serializing!

Upvotes: 1

Related Questions