none
Sobre el IsolatedStorage File...

    Question

  • Buenas, antes de formular la pregunta, he leido manuales acerca del tema, buscado en el foro y visto diferente documentación.

    El problema que tengo es que puedo crear un fichero perfectamente pero, después compruebo si existe y si es asi se borra, en este paso o al intentar abrir el archivo para tratarlo posteriormente, falla.

    Expongo mi codigo:

            public void GuardaHistorial()
            {

                DataContractJsonSerializer serializador = new DataContractJsonSerializer(typeof(List<string>));
                IsolatedStorageFile isf = IsolatedStorageFile.GetUserStoreForApplication();

                if (isf.FileExists("historia.json"))
                {
                    isf.DeleteFile("historia.json");
                }
                Stream str = isf.CreateFile("historia.json");

                serializador.WriteObject(str, ListaHistoria);
                str.Close();
            }

    Si pulso al boton que activa el codigo, crea el fichero perfectamente, pero después, como el fichero existe, entra en el delete (por ejemplo, por que como he dicho antes, al intentar leerlo peta igualmente). El caso, el mensaje de error es el siguiente:

    No se controló System.IO.IsolatedStorage.IsolatedStorageException
      Message=An error occurred while accessing IsolatedStorage.
      StackTrace:
           at System.IO.IsolatedStorage.IsolatedStorageFile.DeleteFile(String file)
           at Proyecto1.ListaHistoricocs.GuardaHistorial()
           at Proyecto1.buscar.BtnBuscar_Click(Object sender, RoutedEventArgs e)
           at System.Windows.Controls.Primitives.ButtonBase.OnClick()
           at System.Windows.Controls.Button.OnClick()
           at System.Windows.Controls.Primitives.ButtonBase.OnMouseLeftButtonUp(MouseButtonEventArgs e)
           at System.Windows.Controls.Control.OnMouseLeftButtonUp(Control ctrl, EventArgs e)
           at MS.Internal.JoltHelper.FireEvent(IntPtr unmanagedObj, IntPtr unmanagedObjArgs, Int32 argsTypeIndex, String eventName)

     

    ¿Alguna idea?

    Gracias a todos

    Tuesday, August 30, 2011 7:10 PM

Answers

  • Hola,

    Si que te ha dado tiempo a probar cosas... pero no has probado lo principal :D, en un método que no nos has contado debes abrir el fichero, algo tal que así (por cómo escribías el código en el primer ejemplo:)

    private void LeerHistorial()
    {
        IsolatedStorageFile isf = IsolatedStorageFile.GetUserStoreForApplication();
    
        if (isf.FileExists("historia.json"))
        {
            Stream s = isf.OpenFile("historia.json", FileMode.Open);
            /// etc...
        }
    }
    
    


    Bien, pues tu problema será que el Stream no se ha cerrado, es decir, el fichero te lo has dejado abierto y por lo tanto no se puede borrar. Es verdad que el mensaje de error es bastante inespecífico, para eso habrá que quejarse al equipo del compact framework, pero ten en cuenta que por algo es "compact" :P. En fin, bastará que metas las llamadas dentro de bloques using, tal como te comentaba Pedro en el primer mensaje para tu método de guardar:

    private void LeerHistorial()
    {
        using (IsolatedStorageFile isf = IsolatedStorageFile.GetUserStoreForApplication())
        {
    
            if (isf.FileExists("historia.json"))
            {
                using (Stream s = isf.OpenFile("historia.json", FileMode.Open))
                {
                    /// etc...
                }
            }
        }
    }
    
    

    Y verás como te funcionará mucho mejor :D

    Saludos,

    -Juanma


    Juan Manuel Servera
    twitter: @jmservera
    mi blog: http://jmservera.wordpress.com
    Únete al grupo de WP7 en LinkedIn
    MCPD WP7 Developer - MCTS Sharepoint 2010 Application Development
    • Marked as answer by Jnavero Friday, September 02, 2011 2:51 PM
    Thursday, September 01, 2011 11:53 PM
  • Perdona que insista, pero creo que no me estás entendiendo. El código de BtnBuscar_Click no nos lo ha pasado en ningún momento, tampoco el método que usa para leer el fichero, sólo vemos el código del método GuardarHistorial.

    Puede que en el manejador del evento o en cualquier otro método que nos ha pasado, esté abriendo el fichero para leerlo, de hecho sería muy raro que su programa sólo guardara el fichero pero nunca lo abriera para leer. Es decir, usando: isf.OpenFile("historia.json", FileMode.Open)

    Vosotros os estáis centrando en el guardado del fichero, pues es ahí donde aparece el fallo, pero el problema viene de haber abierto el fichero y no cerrarlo. Lo he podido reproducir exactamente, con el mismo fallo que le da a él escribiendo esto:

     

    private void button1_Click(object sender, RoutedEventArgs e)
    {
        GuardaHistorial();
        LeerHistorial();
    }
    
    private void LeerHistorial()
    {
        IsolatedStorageFile isf = IsolatedStorageFile.GetUserStoreForApplication();
    
        if (isf.FileExists("historia.json"))
        {
            Stream s = isf.OpenFile("historia.json", FileMode.Open);
            /// etc...
        }
    }
    
     public void GuardaHistorial()
    {
    
        DataContractJsonSerializer serializador = 
            new DataContractJsonSerializer(typeof(List<string>));
        IsolatedStorageFile isf = IsolatedStorageFile.GetUserStoreForApplication();
    
        if (isf.FileExists("historia.json"))
        {
            isf.DeleteFile("historia.json");
        }
        Stream str = isf.CreateFile("historia.json");
    
         List<string> list=new List<string>();
         list.Add("uno");
         list.Add("dos");
        serializador.WriteObject(str, list );
        str.Close();
    }
    
    

     


    Si sustituyes el método LeerHistorial por el que yo comentaba en mi primer mensaje deja de fallar. He puesto LeerHistorial tras GuardarHistoria por su frase:  o al intentar abrir el archivo para tratarlo posteriormente, falla

    De hecho que le haya funcionando al borrar el fichero justo después de crearlo es una pista más, al borrarlo ya no lo puede abrir en ningún otro lado y por lo tanto no lo bloquea. Lo que le pasa es que no ha puesto using en el método de lectura, pues no lo tenía en el método de guardado.

    Un saludo,

    -Juanma


    Juan Manuel Servera
    twitter: @jmservera
    mi blog: http://jmservera.wordpress.com
    Únete al grupo de WP7 en LinkedIn
    MCPD WP7 Developer - MCTS Sharepoint 2010 Application Development
    • Marked as answer by Jnavero Friday, September 02, 2011 2:51 PM
    Friday, September 02, 2011 7:58 AM

All replies

  • Hola @jnavero,

     

    Prueba con este codigo para guardar.

     

    using (var store = IsolatedStorageFile.GetUserStoreForApplication())
      {
       if (store.FileExists("historia.json"))
       {
       store.DeleteFile("historia.json");
       }
       
       using (IsolatedStorageFileStream archivo = store.OpenFile("historia.json", FileMode.Create))
       {
       using (MemoryStream ms = new MemoryStream)
       {
    	    DataContractJsonSerializer serializador = new DataContractJsonSerializer(typeof(List<string>));
    		serializador.WriteObject(ms, ListaHistoria);
       		byte[] secuencia = ms.ToArray();
       		archivo.Write(secuencia, 0, secuencia.Length);   
       }
       }
    }
    

    Saludos,


    phurtado
    Tuesday, August 30, 2011 10:58 PM
  •  

    Buena, antes de nada, gracias por responder, comento, he cambiado mi codigo por el que me has pasado y hace lo mismo exactamente. La primera vez que arranca el emulador el programa funciona perfectamente y crea el fichero bien, pero cuando accede la siguiente vez, como existe le hace el DeleteFile y salta a la siguiente linea de error arrojando la excepcion. he hecho una captura de pantalla para que puedas verlo

     

     

     

     

    Gracias de antemano.

     

    Wednesday, August 31, 2011 5:39 PM
  • Hola,

    Puedes pulsar en "copiar detalles de la excepción en el Portapales" y pasarla.Eso nos dará más información.

     

    Saludos,


    phurtado
    Wednesday, August 31, 2011 7:43 PM
  • Buenas, El "ver detalles" lo tienes al principio del post (stackTrace), no obstante adjunto la captura de la pantalla tambien.

     

    Nota: He cambiado el nombre del proyecto haciendo pruebas y mas pruebas, pero, es que no se que mas probar...

     

    Gracias

     

     

    Wednesday, August 31, 2011 8:12 PM
  • Hola,

    Perdona, pero no me fije en la primera entrada, donde ya mostrabas el stacktrace.

    Se me ocurre que hagas una prueba, es decir que inviertas el código después de grabar elimina, es por ver si el error salta siempre que realizas DeleteFile. Te lo digo porque yo he probado en código varias veces y funciona perfectemente.

     

    using (var store = IsolatedStorageFile.GetUserStoreForApplication())
     {
     
     
     using (IsolatedStorageFileStream archivo = store.OpenFile("historia.json", FileMode.Create))
     {
     	using (MemoryStream ms = new MemoryStream)
     	{
    	 	DataContractJsonSerializer serializador = new DataContractJsonSerializer(typeof(List<string>));
    		serializador.WriteObject(ms, ListaHistoria);
     		byte[] secuencia = ms.ToArray();
     		archivo.Write(secuencia, 0, secuencia.Length); 
     	}
     }
    
     if (store.FileExists("historia.json"))
     {
      store.DeleteFile("historia.json");
     }
    }
    

     


    Como puedes ver lo que intento es ver si siempre nos salta el error, incluso la primera vez.

     

    Saludos,

     


    phurtado
    Thursday, September 01, 2011 3:03 PM
  • Buenas pedro,

     

    Si lo pongo al reves, funciona perfectamente. Es decir creo el archivo y acto seguido lo borro.

    Ahora si que no entiendo nada...

     

     

    Saludos.

     

    Thursday, September 01, 2011 3:35 PM
  • Hola,

     

    Descargate esto http://wp7explorer.codeplex.com/ y lo instalas es bastante bueno. Deja el código como estaba, crea el archivo  y prueba si con está herramienta lo puedes eliminar.

     

    Me suena el tema o a permisos Ejecuta visual studio como Administrador, o algó que esté mal instalado en esa maquina.

     

    Es que es bastante raro, se han respondido bastantes preguntas en foro, con esto, pero es la primera vez que lo veo.

     

    Invoco a la sabiduría Yosue,Vicente,Juan Manuel...

     

    Saludos,

     

     


    phurtado
    Thursday, September 01, 2011 3:42 PM
  • yo tambien pensé que era de permisos, pero, estube mirando y no he encontrado forma de mirar los permisos en windows phone (por aquello que silverligth puede no tenerc activo el isolatedstorage).

     

    He ejecutado el visual studio en modo administrador y sigue igual. de momento he obtado por borrar todo el sdk de windows phone 7 y reinstalarlo por si acaso hay algun problema (no se)

     

    La verdad es que ya no se que mas mirar...

    Ya os contaré con la reinstalacion, a ver si cambia algo el tema.

     

    Saludos.

    Thursday, September 01, 2011 4:46 PM
  • Hola @janvero,

     

    Yo también he estado intentado descubrir donde se guardaban los archivos y me ha sido imposible localizarlos. La última prueba que te comente era precisamente por si no tenias permiso para eliminar el archivo, pero por lo que veo ese no es el problema.

     

    Respecto a la reinstalación, es lo mejor que puedes hacer de hecho yo también reinstalaría silverlight,  te comento esto por esta frase que he leido en este post

     

    http://www.addictivetips.com/mobile/how-to-edit-windows-phone-7-silverlight-isolated-storage-file/

    This data is stored by Silverlight in an isolated storage file rather than directly on the file system and so fa

     

    Por eso te comente lo de instalar http://wp7explorer.codeplex.com/  Para ver si podías eliminar el archivo.

     

    Esperamos tus noticias o las de alguien a quien le haya pasado algo parecido.

     

    Saludos,

     


    phurtado
    Thursday, September 01, 2011 7:55 PM
  • He reinstalado el visual studio y las sdk de windows phone (he instalado la RC de la web oficial que incluye el emulador ademas del visual studio express).

    tambien he reinstalado el silverlight pero, por desgracia, esto sigue igual.

    He probado en mi portatil tambien con vs 2010 instalado y el sdk de windows phone 7 y hace exactamente lo mismo.

     

    He instalado la aplicacion de codeplex, pero aun no la he podido probar.

    Me queda hacer la prueba de esa aplicacion y crear un proyecto nuevo vacio con un boton y que llame al isolatedstorage para volver a quedarme sin ideas...

     

    Os seguiré contando,

    Saludos.

    Thursday, September 01, 2011 10:44 PM
  • Hola,

    Si que te ha dado tiempo a probar cosas... pero no has probado lo principal :D, en un método que no nos has contado debes abrir el fichero, algo tal que así (por cómo escribías el código en el primer ejemplo:)

    private void LeerHistorial()
    {
        IsolatedStorageFile isf = IsolatedStorageFile.GetUserStoreForApplication();
    
        if (isf.FileExists("historia.json"))
        {
            Stream s = isf.OpenFile("historia.json", FileMode.Open);
            /// etc...
        }
    }
    
    


    Bien, pues tu problema será que el Stream no se ha cerrado, es decir, el fichero te lo has dejado abierto y por lo tanto no se puede borrar. Es verdad que el mensaje de error es bastante inespecífico, para eso habrá que quejarse al equipo del compact framework, pero ten en cuenta que por algo es "compact" :P. En fin, bastará que metas las llamadas dentro de bloques using, tal como te comentaba Pedro en el primer mensaje para tu método de guardar:

    private void LeerHistorial()
    {
        using (IsolatedStorageFile isf = IsolatedStorageFile.GetUserStoreForApplication())
        {
    
            if (isf.FileExists("historia.json"))
            {
                using (Stream s = isf.OpenFile("historia.json", FileMode.Open))
                {
                    /// etc...
                }
            }
        }
    }
    
    

    Y verás como te funcionará mucho mejor :D

    Saludos,

    -Juanma


    Juan Manuel Servera
    twitter: @jmservera
    mi blog: http://jmservera.wordpress.com
    Únete al grupo de WP7 en LinkedIn
    MCPD WP7 Developer - MCTS Sharepoint 2010 Application Development
    • Marked as answer by Jnavero Friday, September 02, 2011 2:51 PM
    Thursday, September 01, 2011 11:53 PM
  • Hola Jose Manuel,

     

    Esto ya se probo más arriba concretamente aqui.

     

    using (var store = IsolatedStorageFile.GetUserStoreForApplication())
      {
       if (store.FileExists("historia.json"))
       {
       store.DeleteFile("historia.json");
       }
       
       using (IsolatedStorageFileStream archivo = store.OpenFile("historia.json", FileMode.Create))
       {
       using (MemoryStream ms = new MemoryStream)
       {
    	    DataContractJsonSerializer serializador = new DataContractJsonSerializer(typeof(List<string>));
    		serializador.WriteObject(ms, ListaHistoria);
       		byte[] secuencia = ms.ToArray();
       		archivo.Write(secuencia, 0, secuencia.Length);   
       }
       }
    }
    
    En ese código que yo sepa se cierra todo. Y a mi me funciona perfectamente, por eso apunte al resto.
    Saludo,


    phurtado
    Thursday, September 01, 2011 11:59 PM
  • Efectivamente, lo cierra todo y es lo que tiene que hacer en el método donde lee, también tiene que cerrar, lo que pasa que ese método no nos lo ha puesto en el ejemplo y probablemente no lo modificó (vamos, estoy casi seguro que es eso). Sólo ha modificado el método donde guarda, pero en algún sitio tendrá que leer el fichero para que le sirva para algo y si no lo cierra no podrá borrarlo. ;)

     

    Saludos,

    -Juanma


    Juan Manuel Servera
    twitter: @jmservera
    mi blog: http://jmservera.wordpress.com
    Únete al grupo de WP7 en LinkedIn
    MCPD WP7 Developer - MCTS Sharepoint 2010 Application Development
    Friday, September 02, 2011 12:07 AM
  • Hola Juanma,

    Ese metodo nos lo pasó al principio  y en el stacktrace puedes ver que viene de un buton_click  y lo más sorprendente es que yo le he dicho que elimine el archivo después de crearlo y le ha funcionado, cosa que me ha  parecido rara, en un principio pense en temas de permisos.

     

    Se supone que el código que hemos pasado lo ha copiado hay, hay una cosa que me parece rara que eso este asignado a un boton buscar. 

    @jnavero puedes pasar todo el código de la página.

     

    Gracias Juanma por lo del apunte de expresión Blend, no tenía ni idea que existía yo cuando instale las herramientas tenía instalado el 4 :)

     

    Saludos,


    phurtado
    Friday, September 02, 2011 12:17 AM
  • Perdona que insista, pero creo que no me estás entendiendo. El código de BtnBuscar_Click no nos lo ha pasado en ningún momento, tampoco el método que usa para leer el fichero, sólo vemos el código del método GuardarHistorial.

    Puede que en el manejador del evento o en cualquier otro método que nos ha pasado, esté abriendo el fichero para leerlo, de hecho sería muy raro que su programa sólo guardara el fichero pero nunca lo abriera para leer. Es decir, usando: isf.OpenFile("historia.json", FileMode.Open)

    Vosotros os estáis centrando en el guardado del fichero, pues es ahí donde aparece el fallo, pero el problema viene de haber abierto el fichero y no cerrarlo. Lo he podido reproducir exactamente, con el mismo fallo que le da a él escribiendo esto:

     

    private void button1_Click(object sender, RoutedEventArgs e)
    {
        GuardaHistorial();
        LeerHistorial();
    }
    
    private void LeerHistorial()
    {
        IsolatedStorageFile isf = IsolatedStorageFile.GetUserStoreForApplication();
    
        if (isf.FileExists("historia.json"))
        {
            Stream s = isf.OpenFile("historia.json", FileMode.Open);
            /// etc...
        }
    }
    
     public void GuardaHistorial()
    {
    
        DataContractJsonSerializer serializador = 
            new DataContractJsonSerializer(typeof(List<string>));
        IsolatedStorageFile isf = IsolatedStorageFile.GetUserStoreForApplication();
    
        if (isf.FileExists("historia.json"))
        {
            isf.DeleteFile("historia.json");
        }
        Stream str = isf.CreateFile("historia.json");
    
         List<string> list=new List<string>();
         list.Add("uno");
         list.Add("dos");
        serializador.WriteObject(str, list );
        str.Close();
    }
    
    

     


    Si sustituyes el método LeerHistorial por el que yo comentaba en mi primer mensaje deja de fallar. He puesto LeerHistorial tras GuardarHistoria por su frase:  o al intentar abrir el archivo para tratarlo posteriormente, falla

    De hecho que le haya funcionando al borrar el fichero justo después de crearlo es una pista más, al borrarlo ya no lo puede abrir en ningún otro lado y por lo tanto no lo bloquea. Lo que le pasa es que no ha puesto using en el método de lectura, pues no lo tenía en el método de guardado.

    Un saludo,

    -Juanma


    Juan Manuel Servera
    twitter: @jmservera
    mi blog: http://jmservera.wordpress.com
    Únete al grupo de WP7 en LinkedIn
    MCPD WP7 Developer - MCTS Sharepoint 2010 Application Development
    • Marked as answer by Jnavero Friday, September 02, 2011 2:51 PM
    Friday, September 02, 2011 7:58 AM
  • Hola Juanma.

    Por eso solicite esto :)

    @jnavero puedes pasar todo el código de la página.

    Si puede ser que sea lo que comentas.

    Saludos,



    phurtado
    Friday, September 02, 2011 9:16 AM
  • lo dicho, despues de hacer mil pruebas, me puedo pegar un tiro...

    hice lo ultimo y es meter el tema del isolated con un boton como ha dicho juanma. y efectivamente, ha funcionado perfectamente, se debe a que en otra parte del codigo ajeno saltaba un evento que comprobaba el historial abriendo el fichero pero, no lo cerraba.

    al portar el trozo y la pistas aqui dadas he podido ver el error.

     

    Gracias a los dos por vuestra ayuda.

     

    Friday, September 02, 2011 2:50 PM