2009-07-11 21 views

答えて

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

少なくともSilverlight 4では、このリフレクションを実行しようとすると... mscorlib.dllで 'System.FieldAccessException'型の最初のチャンス例外が発生しました 追加情報:メソッド 'Comms.MainPage.LayoutRoot_Loaded (System.Object、System.Windows.RoutedEventArgs) 'フィールド' System.IO.IsolatedStorage.IsolatedStorageFile.m_StorePath 'にアクセスできませんでした。また、 "m_FullPath"ではなく "m_StorePath"になりました。それを使用しない理由がさらにあります。 – DJA

+0

@DJAセキュリティ上の理由から、Silverightでリフレクションしてプライベートメンバーを取得できないためです。 – ghord

6

代わりの一時ファイルを作成し、それを直接ストアからのパスを取得することができ場所を取得:

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

を私がするFileStreamのNameプロパティを使用します。

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

このコードはWindows Phone 8 SDKでテストされています。

+1

「デスクトップ」.Net 4.5では、名前は「不明」です。 – habakuk

関連する問題