Как написать файл с помощью StreamWriter в Windows 8?
У меня возникают проблемы при создании объекта StreamWriter
в Windows-8, обычно я просто создаю экземпляр, просто передающий строку в качестве параметра, но в Windows 8 появляется ошибка, указывающая на то, что она должна получить поток, но я заметил, что Stream является абстрактным классом. Кто-нибудь знает, как будет писать код xml файла?, BTW Я использую .xml, потому что хочу сохранить сериализованный объект, или кто-нибудь знает, как сэкономить файл - сериализованный объект в Windows 8?.
Любые идеи?
В настоящее время используется предварительный просмотр Windows 8
код:
StreamWriter sw = new StreamWriter("person.xml");
Ошибка:
The best overloaded method match for 'System.IO.StreamWriter.StreamWriter(System.IO.Stream)' has some invalid arguments
Ответы
Ответ 1
Вместо 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 для использования образца.
ИЗМЕНИТЬ *
В то время как все вышеперечисленное должно работать - они были написаны до того, как класс FileIO
стал доступен в WinRT, что упростит большинство распространенных сценариев, которые решает вышеупомянутое решение так как теперь вы можете просто вызвать await FileIO.WriteTextAsync(file, contents)
для записи текста в файл, а также есть аналогичные методы для чтения, записи или добавления строк, байтов, списков строк или IBuffers
.
Ответ 2
Вы можете создать общий статический метод, который вы можете использовать через приложение, подобное этому
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 use
StorageFile file = await ApplicationData.Current.LocalFolder.GetFileAsync("data.xml");
Data = await ReadXml<List<myclass>>(file);