2012-04-24 3 views
18

У меня возникли проблемы при создании объекта StreamWriter в Windows-8, как правило, я просто создаю экземпляр, просто передающий строку в качестве параметра, но в Windows 8 я получаю сообщение об ошибке, указывающее, что он должен получить поток, но я заметил, что Stream является абстрактным классом. Кто-нибудь знает, как будет писать код xml-файла ?, BTW Я использую .xml, потому что хочу сохранить сериализованный объект, или кто-нибудь знает, как сохранить файл сериализованный объект в Windows 8 ?.Как написать файл с помощью StreamWriter в Windows 8?

Любые идеи?

В настоящее время с помощью Windows 8 Consumer Preview

Код:

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

Ошибка:

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

+1

Это не имеет ничего общего с Windows 8 или любой ОС. Вам просто нужно передать правильный параметр конструктору. Когда он говорит, что ему нужен «поток», вы должны использовать класс, который расширяет «поток». Я бы предположил, что вы * google * о 'Stream'. В первом результате я даже показал видео о том, как его использовать (http://www.youtube.com/watch?v=QKGjWMlba9s) – MilkyWayJoe

+1

спасибо за быстрый ответ, но на самом деле я знаю, как использовать класс StreamWriter, но в этом случае я создал проект Metro Metro Windows, и я работаю с XAML, а класс StreamWriter не работает, поскольку он работал в приложениях Windows Form, я просто получаю эту ошибку, и даже я пробовал, что вы (создайте класс, который расширяет класс Stream), он просто реализует пустые методы и не имеет метода, который получает в качестве параметра путь, в котором будет создан поток ... –

+0

..., все, что я нашел в google , просто покажите, как я знаю, как создать объект StreamWriter, я не смог найти ссылку, которая указывает, как создать StreamWriter или Stream в проекте Windows Metro. Кто-нибудь работает с Streams в проекте Metro Metro, как будет выглядеть код для записи файла с помощью StreamWriter? –

ответ

27

Вместо StreamWriter вы бы использовать что-то вроде этого:

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(); 
    } 
} 

Вы можете посмотреть класс StringIOExtensions в библиотеке WinRTXamlToolkit для использования в качестве примера.

EDIT *

Хотя все выше, должны работать - они были написаны до того, как FileIO класс стал доступен в WinRT, что упрощает большинство распространенных сценариев, что вышеупомянутое решение решает, так как теперь вы можете просто позвонить await FileIO.WriteTextAsync(file, contents) написать текст в файл, а также есть аналогичные методы для чтения, записи или добавления строк, байтов, списков строк или IBuffers.

+0

Спасибо, Филипп!, Мне очень помогает WinRTXamlToolkit !!! –

+0

Glad Я мог бы помочь –

+0

Спасибо за обновленное предложение использовать 'FileIO', работает для меня. – Jonathan

4

Вы можете создать общий статический метод, который можно использовать путем из приложения, как этот

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()); 

     } 

    } 

писать XML просто использовать

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

и читать использование XML

StorageFile file = await ApplicationData.Current.LocalFolder.GetFileAsync("data.xml"); 
     Data = await ReadXml<List<myclass>>(file); 
Смежные вопросы