2010-12-20 11 views
11

Estoy tratando de localizar la ruta para la carpeta AppData\LocalLow.Detectar la ubicación de AppData LocalLow

he encontrado un ejemplo que utiliza:

string folder = "c:\users\" + Environment.UserName + @"\appdata\LocalLow"; 

que por una está ligada a c: y para users que parece un poco frágil.

He intentado utilizar

Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData) 

pero esto me da AppData\Local, y necesito LocalLow debido a las restricciones de seguridad de la aplicación se está ejecutando bajo. También regresó en blanco para mi usuario de servicio (al menos cuando se conecta al proceso).

¿Alguna otra sugerencia?

+0

¿Hay alguna razón no se puede appent un 'Low' a la cadena devuelta? – Oded

+0

o 'Path.Combine (localData, @" .. \ LocalLow ")' –

+0

Por supuesto, podría agregar bajo o usar combinación de rutas, pero creo que la solución de @Thomas es la mejor. Como ya es una llamada de sistema operativo, preferiría usar eso. –

Respuesta

18

La enumeración de Environment.SpecialFolder se mapea a CSIDL, pero no hay CSIDL para la carpeta LocalLow. Así que hay que utilizar el KNOWNFOLDERID lugar, con la API SHGetKnownFolderPath:

void Main() 
{ 
    Guid localLowId = new Guid("A520A1A4-1780-4FF6-BD18-167343C5AF16"); 
    GetKnownFolderPath(localLowId).Dump(); 
} 

string GetKnownFolderPath(Guid knownFolderId) 
{ 
    IntPtr pszPath = IntPtr.Zero; 
    try 
    { 
     int hr = SHGetKnownFolderPath(knownFolderId, 0, IntPtr.Zero, out pszPath); 
     if (hr >= 0) 
      return Marshal.PtrToStringAuto(pszPath); 
     throw Marshal.GetExceptionForHR(hr); 
    } 
    finally 
    { 
     if (pszPath != IntPtr.Zero) 
      Marshal.FreeCoTaskMem(pszPath); 
    } 
} 

[DllImport("shell32.dll")] 
static extern int SHGetKnownFolderPath([MarshalAs(UnmanagedType.LPStruct)] Guid rfid, uint dwFlags, IntPtr hToken, out IntPtr pszPath); 
+0

Justo lo que estaba buscando :) –

Cuestiones relacionadas