2009-07-11 8 views

risposta

23

È possibile recuperare il percorso di un file di archiviazione isolato su disco accedendo a un campo privato della classe IsolatedStorageFileStream utilizzando la riflessione. Ecco un esempio:


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

Non sono sicuro che sia una pratica consigliata.

Ricordare che la posizione su disco dipende dalla versione del sistema operativo e che è necessario assicurarsi che l'altra applicazione disponga delle autorizzazioni per accedere a tale posizione.

+2

Almeno in Silverlight 4, ogni tentativo di fare questo i risultati di riflessione in ... Una prima eccezione di possibilità di tipo 'System.FieldAccessException' in mscorlib.dll Ulteriori informazioni: Tentativo con il metodo 'Comms.MainPage.LayoutRoot_Loaded (System.Object, System.Windows.RoutedEventArgs) 'per accedere al campo' System.IO.IsolatedStorage.IsolatedStorageFile.m_StorePath 'non riuscito. Inoltre, ora è "m_StorePath" e non "m_FullPath" - ancora più motivo per non usarlo. – DJA

+0

@DJA Questo perché non puoi ottenere membri privati ​​con la riflessione in Silveright a causa di problemi di sicurezza. – ghord

6

Invece di creare un file temporaneo e ottenere la posizione è possibile ottenere il percorso dal negozio direttamente:

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

Io uso Nome proprietà di 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; 
} 

Questo codice è stato testato in Windows Phone 8 SDK.

+1

In "Desktop" .Net 4.5 il nome è "Sconosciuto" – habakuk

Problemi correlati