Определить местоположение AppData\LocalLow

Я пытаюсь найти путь для AppData\LocalLow папка.

Я нашел пример, который использует:

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

который, к примеру, привязан к c: и к users который кажется немного хрупким.

Я пытался использовать

Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData)

но это дает мне AppData\Localи мне нужен LocalLow из-за ограничений безопасности, под которыми работает приложение. Он также пуст для моего пользователя службы (по крайней мере, при подключении к процессу).

Любые другие предложения?

3 ответа

Решение

Environment.SpecialFolder Перечень карт в CSIDL, но нет CSIDL для LocalLow папка. Таким образом, вы должны использовать KNOWNFOLDERID вместо этого с SHGetKnownFolderPath API:

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

Ответ Томаса эффективен, но излишне сложен для некоторых случаев использования.

Быстрое решение:

      string LocalLowPath = 
Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData).Replace("Roaming","LocalLow");

Действительно, предложение, которое вы нашли, хрупкое. Я не знал метода Томаса, но если вы все еще считаете его простым, вот способ определить букву диска, а также символ-разделитель пути. Это по-прежнему будет зависеть от Windows, но все три варианта ниже работают одинаково, выводя «C:\Users\MyUser\AppData\LocalLow», где «MyUser» — это имя пользователя на машине, на которой вы это запускаете. Здесь есть и другие специальные папки , но ниже те, которые вам нужны.

      // UserProfile = C:\Users\MyUser
string folderFromUserProfile = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.UserProfile), "AppData", "LocalLow");
string folderAppendingFromLocalAppData = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData)) + "Low";
// GetFullPath expands from relative to absolute, removing the ".."
string folderRelativeFromLocalAppData = Path.GetFullPath(Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), "..", "LocalLow"));

Это предполагает, что у вас есть

      using System;
using System.IO;
Другие вопросы по тегам