2012-04-24 33 views
18

Tôi gặp sự cố khi tạo đối tượng StreamWriter trong windows-8, thường là tôi chỉ tạo một cá thể chỉ chuyển một chuỗi làm tham số, nhưng trong Windows 8, tôi nhận được lỗi cho biết rằng nó sẽ nhận luồng, nhưng tôi nhận thấy rằng Stream là một lớp trừu tượng, Có ai biết làm thế nào sẽ là mã để viết một tập tin xml ?, BTW Tôi đang sử dụng .xml vì tôi muốn lưu các đối tượng serialized, hoặc không ai biết làm thế nào để lưu vào một tập tin đối tượng được tuần tự hóa trong Windows 8 ?.Cách ghi tệp bằng StreamWriter trong Windows 8?

Bất kỳ ý tưởng nào?

Hiện đang sử dụng Windows 8 Consumer Preview

Code:

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

Lỗi:

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

+1

Điều này không liên quan gì đến Windows 8 hoặc bất kỳ hệ điều hành nào. Bạn chỉ cần truyền tham số chính xác cho hàm tạo. Khi nó nói nó cần một 'Stream', bạn phải sử dụng một class mở rộng' Stream'. Tôi sẽ đề nghị bạn * google * về 'Stream'. Kết quả đầu tiên tôi nhận được thậm chí còn hiển thị video về cách sử dụng nó (http://www.youtube.com/watch?v=QKGjWMlba9s) – MilkyWayJoe

+1

cảm ơn bạn đã trả lời nhanh, nhưng thực tế tôi biết cách sử dụng lớp StreamWriter, nhưng trong trường hợp này tôi đã tạo một dự án Windows Metro Style và tôi đang làm việc với XAML, và lớp StreamWriter nó không hoạt động như nó được sử dụng để làm việc trong các ứng dụng Windows Form, tôi chỉ gặp lỗi này, và thậm chí tôi đã thử những gì bạn được đề xuất (tạo một lớp mở rộng lớp Stream), nó chỉ thực hiện các phương thức rỗng và không có phương thức nhận làm tham số đường dẫn nơi luồng sẽ được tạo ... –

+0

..., tất cả những gì tôi tìm thấy trong google , chỉ hiển thị cách tôi biết về cách tạo đối tượng StreamWriter, tôi không thể tìm thấy bất kỳ tham chiếu nào cho biết cách tạo StreamWriter hoặc Luồng trong dự án Windows Metro. Có ai làm việc với các luồng trong một dự án Windows Metro, làm thế nào sẽ là mã để viết một tập tin bằng cách sử dụng StreamWriter? –

Trả lời

27

Thay vì StreamWriter bạn sẽ sử dụng một cái gì đó như thế này:

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

Bạn có thể xem lớp StringIOExtensions trong thư viện WinRTXamlToolkit để sử dụng mẫu.

EDIT *

Trong khi tất cả các bên trên nên làm việc - họ đã viết trước lớp FileIO trở nên có sẵn trong WinRT, mà đơn giản hóa hầu hết các kịch bản phổ biến mà các giải pháp trên giải quyết vì bạn có thể bây giờ chỉ cần gọi await FileIO.WriteTextAsync(file, contents) viết văn bản vào tệp và cũng có các phương pháp tương tự để đọc, viết hoặc nối chuỗi, byte, danh sách chuỗi hoặc IBuffers.

+0

Cảm ơn Filip !!, WinRTXamlToolkit giúp tôi rất nhiều !!! –

+0

Vui vì tôi có thể giúp –

+0

Cảm ơn bạn đã đề xuất cập nhật để sử dụng 'FileIO', phù hợp với tôi. – Jonathan

4

Bạn có thể tạo một phương pháp tĩnh thông thường mà bạn có thể sử dụng thông qua ứng dụng ra như thế này

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

     } 

    } 

viết xml chỉ cần sử dụng

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

và đọc sử dụng xml

StorageFile file = await ApplicationData.Current.LocalFolder.GetFileAsync("data.xml"); 
     Data = await ReadXml<List<myclass>>(file); 
Các vấn đề liên quan