2012-04-24 15 views
18

Tengo problemas al crear un objeto StreamWriter en windows-8, generalmente solo creo una instancia que pasa una cadena como parámetro, pero en Windows 8 aparece un error que indica que debe recibir una secuencia, pero notamos que Stream es una clase abstracta, ¿Alguien sabe cómo será el código para escribir un archivo xml ?, BTW estoy usando .xml porque quiero guardar el objeto serializado, o alguien sabe cómo guardarlo en un archivo. objeto serializado en Windows 8 ?.¿Cómo se escribe un archivo usando StreamWriter en Windows 8?

¿Alguna idea?

Actualmente el uso de Windows 8 Consumer Preview

Código:

StreamWriter sw = new StreamWriter("person.xml");

error:

The best overloaded method match for 'System.IO.StreamWriter.StreamWriter(System.IO.Stream)' has some invalid arguments

+1

Esto no tiene nada que ver con Windows 8 o cualquier sistema operativo. Solo necesita pasar el parámetro correcto al constructor. Cuando dice que necesita un 'Stream', debes usar una clase que amplíe' Stream'. Sugeriría que * google * sobre 'Stream'. El primer resultado que obtuve incluso muestra un video de cómo usarlo (http://www.youtube.com/watch?v=QKGjWMlba9s) – MilkyWayJoe

+1

gracias por la respuesta rápida, pero de hecho, sé cómo usar la clase StreamWriter, pero en este caso creé un proyecto Windows Metro Style y estoy trabajando con XAML, y la clase StreamWriter no funciona como solía funcionar en las aplicaciones de Windows Form. Acabo de recibir este error, e incluso eso intenté lo que propuesto (crear una clase que amplíe la clase Stream), simplemente implementa métodos vacíos y no tiene un método que reciba como parámetro la ruta donde se creará la secuencia ... –

+0

..., todo lo que encontré en google , solo muestro la forma en que sé sobre cómo crear un objeto StreamWriter, no pude encontrar ninguna referencia que indique cómo crear un StreamWriter o Stream en un proyecto de Windows Metro. ¿Alguien trabaja con Streams en Windows Metro Project, cómo será el código para escribir un archivo usando StreamWriter? –

Respuesta

27

En lugar de StreamWriter que usaría algo como esto:

StorageFolder folder = ApplicationData.Current.LocalFolder; 
StorageFile file = await folder.CreateFileAsync(); 

using (IRandomAccessStream fileStream = await file.OpenAsync(FileAccessMode.ReadWrite)) 
{ 
    using (IOutputStream outputStream = fileStream.GetOutputStreamAt(0)) 
    { 
     using (DataWriter dataWriter = new DataWriter(outputStream)) 
     { 
      //TODO: Replace "Bytes" with the type you want to write. 
      dataWriter.WriteBytes(bytes); 
      await dataWriter.StoreAsync(); 
      dataWriter.DetachStream(); 
     } 

     await outputStream.FlushAsync(); 
    } 
} 

Puede ver la clase StringIOExtensions en la biblioteca WinRTXamlToolkit para el uso de muestra.

EDITAR *

Mientras todo lo anterior debe trabajar - que fueron escritos antes de disponer de la clase FileIO en WinRT, lo que simplifica la mayoría de los escenarios comunes que la solución anterior resuelve desde ahora se puede simplemente llamar await FileIO.WriteTextAsync(file, contents) escribir texto en archivo y también hay métodos similares para leer, escribir o anexar cadenas, bytes, listas de cadenas o IBuffers.

+0

Gracias Filip !!, WinRTXamlToolkit me ayuda mucho !!! –

+0

Me alegro de poder ayudar –

+0

Gracias por la sugerencia actualizada de usar 'FileIO', me funciona. – Jonathan

4

Se puede crear un método estático común que se puede utilizar durante todo aplicación como esta

private async Task<T> ReadXml<T>(StorageFile xmldata) 
    { 
     XmlSerializer xmlser = new XmlSerializer(typeof(List<myclass>)); 
     T data; 
     using (var strm = await xmldata.OpenStreamForReadAsync()) 
     { 
      TextReader Reader = new StreamReader(strm); 
      data = (T)xmlser.Deserialize(Reader); 
     } 
     return data; 
    } 

    private async Task writeXml<T>(T Data, StorageFile file) 
    { 
     try 
     { 
      StringWriter sw = new StringWriter(); 
      XmlSerializer xmlser = new XmlSerializer(typeof(T)); 
      xmlser.Serialize(sw, Data); 

      using (IRandomAccessStream fileStream = await file.OpenAsync(FileAccessMode.ReadWrite)) 
      { 
       using (IOutputStream outputStream = fileStream.GetOutputStreamAt(0)) 
       { 
        using (DataWriter dataWriter = new DataWriter(outputStream)) 
        { 
         dataWriter.WriteString(sw.ToString()); 
         await dataWriter.StoreAsync(); 
         dataWriter.DetachStream(); 
        } 

        await outputStream.FlushAsync(); 
       } 
      } 


     } 
     catch (Exception e) 
     { 
      throw new NotImplementedException(e.Message.ToString()); 

     } 

    } 

escribir XML simplemente utilizar

StorageFile file = await ApplicationData.Current.LocalFolder.CreateFileAsync("data.xml",CreationCollisionOption.ReplaceExisting); 
     await writeXml(Data,file); 

y leer utilizar XML

StorageFile file = await ApplicationData.Current.LocalFolder.GetFileAsync("data.xml"); 
     Data = await ReadXml<List<myclass>>(file); 
Cuestiones relacionadas