2012-04-24 13 views
18

मुझे विंडोज़ -8 में StreamWriter ऑब्जेक्ट बनाने के दौरान परेशानी हो रही है, आमतौर पर मैं सिर्फ पैरामीटर के रूप में एक स्ट्रिंग को पास करने का एक उदाहरण बना देता हूं, लेकिन विंडोज 8 में मुझे एक त्रुटि मिलती है जो इंगित करती है कि इसे स्ट्रीम प्राप्त करना चाहिए, लेकिन मैं ध्यान दिया कि स्ट्रीम एक अमूर्त वर्ग है, क्या कोई जानता है कि xml फ़ाइल लिखने के लिए कोड कैसा होगा ?, बीटीडब्ल्यू मैं .xml का उपयोग कर रहा हूं क्योंकि मैं धारावाहिक ऑब्जेक्ट को सहेजना चाहता हूं, या कोई जानता है कि फ़ाइल को कैसे सहेजना है विंडोज 8 में serialized वस्तु?विंडोज 8 में StreamWriter का उपयोग कर फ़ाइल कैसे लिखें?

कोई विचार?

वर्तमान में 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

इसका विंडोज 8 या किसी ओएस के साथ कुछ लेना देना नहीं है। आपको केवल कन्स्ट्रक्टर को सही पैरामीटर पारित करने की आवश्यकता है। जब यह कहता है कि इसे 'स्ट्रीम' की आवश्यकता है, तो आपको 'स्ट्रीम' को विस्तारित करने वाली कक्षा का उपयोग करना होगा। मैं सुझाव दूंगा कि आप * स्ट्रीम * के बारे में * google *। पहला परिणाम मुझे यह भी मिला कि इसका उपयोग कैसे किया जाए (http://www.youtube.com/watch?v=QKGjWMlba9s) – MilkyWayJoe

+1

त्वरित उत्तर के लिए धन्यवाद, लेकिन वास्तव में मुझे स्ट्रीमवाइटर क्लास का उपयोग करने का तरीका पता है, लेकिन इस मामले में मैंने एक विंडोज मेट्रो स्टाइल प्रोजेक्ट बनाया और मैं एक्सएएमएल के साथ काम कर रहा हूं, और स्ट्रीमवाइटर क्लास यह काम नहीं करता है क्योंकि यह विंडोज फॉर्म ऐप में काम करता था, मुझे बस यह त्रुटि मिलती है, और यहां तक ​​कि मैंने कोशिश की कि आपने क्या किया प्रस्तावित (स्ट्रीम क्लास को विस्तारित करने वाली कक्षा बनाएं), यह केवल खाली विधियों को लागू करता है और इसमें कोई तरीका नहीं है जो पैरामीटर के रूप में प्राप्त होता है, जिस पर धारा बनाई जाएगी ... –

+0

..., जो कुछ मैंने Google में पाया , स्ट्रीमवाइटर ऑब्जेक्ट को बनाने के तरीके के बारे में मुझे पता है कि मुझे कोई संदर्भ नहीं मिला है, जो कि विंडोज मेट्रो प्रोजेक्ट में स्ट्रीमवाइटर या स्ट्रीम बनाने का तरीका इंगित करता है। क्या कोई विंडोज मेट्रो प्रोजेक्ट में स्ट्रीम के साथ काम करता है, स्ट्रीमवाइटर का उपयोग कर फ़ाइल लिखने के लिए कोड कैसे होगा? –

उत्तर

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

आप नमूना उपयोग के लिए WinRTXamlToolkit लाइब्रेरी में StringIOExtensions कक्षा देख सकते हैं।

संपादित करें *

जबकि सब से ऊपर काम करना चाहिए - इससे पहले कि FileIO वर्ग WinRT है, जो सामान्य परिदृश्य का सबसे कि इसके बाद के संस्करण समाधान को हल करती है जब से तुम अब सिर्फ await FileIO.WriteTextAsync(file, contents) फोन लिखने के लिए कर सकते हैं सरल में उपलब्ध हो गया लिखा गया फ़ाइल में टेक्स्ट और स्ट्रिंग्स, बाइट्स, स्ट्रिंग्स की सूचियां या IBuffers पढ़ने, लिखने या जोड़ने के लिए भी समान तरीके हैं।

+0

धन्यवाद फिलिप !!, WinRTXamlToolkit मुझे बहुत मदद करता है !!! –

+0

खुशी मैं –

+0

मदद कर सकता हूं 'फाइलियो' का उपयोग करने के लिए अद्यतन सुझाव के लिए धन्यवाद, मेरे लिए काम करता है। – Jonathan

4

आप बस

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

का उपयोग एक आम स्थिर विधि है जो आप इस

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.GetFileAsync("data.xml"); 
     Data = await ReadXml<List<myclass>>(file); 
संबंधित मुद्दे