簡體   English   中英

如何在Windows 8中使用StreamWriter寫入文件?

[英]How write a file using StreamWriter in Windows 8?

在Windows-8中創建StreamWriter對象時遇到麻煩,通常我只是創建一個實例,只是將字符串作為參數傳遞,但是在Windows 8中,我收到一條錯誤消息,指示它應該接收流,但是我注意到Stream是一個抽象類,有人知道如何編寫xml文件嗎?,順便說一句,我正在使用.xml,因為我想保存序列化的對象,還是有人知道如何將序列化的對象保存到文件中在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

除了使用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();
    }
}

您可以查看WinRTXamlToolkit庫中的StringIOExtensions類,以供示例使用。

編輯*

盡管以上所有方法都可以工作-它們是在WinRT中的FileIO類可用之前編寫的,這簡化了上述解決方案解決的大多數常見情況,因為您現在可以調用await FileIO.WriteTextAsync(file, contents)來將文本寫入文件,還有類似的讀取,寫入或追加字符串,字節,字符串列表或IBuffers

您可以創建一個可以在整個應用程序中使用的通用靜態方法,如下所示

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM