2009-07-11 5 views
15

मैं एक फाइल लिखना चाहता हूं जहां एक बाहरी एप्लिकेशन इसे पढ़ सके, लेकिन मुझे कुछ पृथक स्टोरेज फायदे भी चाहिए, मूल रूप से अप्रत्याशित अपवादों के खिलाफ बीमा। क्या मुझे मिल सकता है?क्या मुझे एक पृथक स्टोरेज फ़ाइल के लिए पथ मिल सकता है और इसे बाहरी अनुप्रयोगों से पढ़ा जा सकता है?

उत्तर

23

प्रतिबिंब का उपयोग करके IsolatedStorageFileStream कक्षा के निजी क्षेत्र तक पहुंचकर आप डिस्क पर एक पृथक संग्रहण फ़ाइल का पथ पुनर्प्राप्त कर सकते हैं। यहां एक उदाहरण दिया गया है:


// Create a file in isolated storage. 
IsolatedStorageFile store = IsolatedStorageFile.GetStore(IsolatedStorageScope.User | IsolatedStorageScope.Assembly, null, null); 
IsolatedStorageFileStream stream = new IsolatedStorageFileStream("test.txt", FileMode.Create, store); 
StreamWriter writer = new StreamWriter(stream); 
writer.WriteLine("Hello"); 
writer.Close(); 
stream.Close(); 

// Retrieve the actual path of the file using reflection. 
string path = stream.GetType().GetField("m_FullPath", BindingFlags.Instance | BindingFlags.NonPublic).GetValue(stream).ToString(); 

मुझे यकीन नहीं है कि यह एक अनुशंसित अभ्यास है।

ध्यान रखें कि डिस्क पर स्थान ऑपरेशन सिस्टम के संस्करण पर निर्भर करता है और आपको यह सुनिश्चित करना होगा कि आपके अन्य एप्लिकेशन को उस स्थान तक पहुंचने की अनुमति है।

+2

कम से कम सिल्वरलाइट 4 में, में ... प्रकार 'System.FieldAccessException' का एक पहला मौका अपवाद इस प्रतिबिंब परिणाम करने के लिए कोई प्रयास mscorlib.dll अतिरिक्त जानकारी में आई: विधि द्वारा 'प्रयास Comms.MainPage.LayoutRoot_Loaded (System.Object, System.Windows.RoutedEventArgs) 'फ़ील्ड तक पहुंचने के लिए' System.IO.IsolatedStorage.IsolatedStorageFile.m_StorePath 'विफल। साथ ही, यह अब "m_StorePath" है और "m_FullPath" नहीं है - इसका उपयोग करने के लिए और भी अधिक कारण नहीं है। – DJA

+0

@ डीजेए ऐसा इसलिए है क्योंकि सुरक्षा संबंधी चिंताओं के कारण आप सिल्वरटाइट में प्रतिबिंब के साथ निजी सदस्यों को नहीं प्राप्त कर सकते हैं। – ghord

6

बजाय एक अस्थायी फ़ाइल बनाने और स्थान पाने की आप की दुकान से सीधे पथ प्राप्त कर सकते हैं:

var path = store.GetType().GetField("m_RootDir", BindingFlags.NonPublic | BindingFlags.Instance).GetValue(store).ToString(); 
8

मैं FileStream का नाम संपत्ति का उपयोग करें।

private static string GetAbsolutePath(string filename) 
{ 
    IsolatedStorageFile isoStore = IsolatedStorageFile.GetUserStoreForApplication(); 

    string absoulutePath = null; 

    if (isoStore.FileExists(filename)) 
    { 
     IsolatedStorageFileStream output = new IsolatedStorageFileStream(filename, FileMode.Open, isoStore); 
     absoulutePath = output.Name; 

     output.Close(); 
     output = null; 
    } 

    return absoulutePath; 
} 

यह कोड विंडोज फोन 8 एसडीके में परीक्षण किया जाता है।

+1

"डेस्कटॉप" में .Net 4.5 नाम "अज्ञात" है – habakuk

संबंधित मुद्दे