检测AppData\LocalLow的位置

Mik*_*son 12 .net c#

我正在尝试找到该AppData\LocalLow文件夹的路径.

我找到了一个使用的例子:

string folder = "c:\users\" + Environment.UserName + @"\appdata\LocalLow";
Run Code Online (Sandbox Code Playgroud)

这对于一个被绑定到c:users这似乎有点脆弱.

我试着用

Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData)
Run Code Online (Sandbox Code Playgroud)

但这给了我AppData\Local,由于应用程序运行的安全限制,我需要LocalLow.它也为我的服务用户返回空白(至少在附加到进程时).

还有其他建议吗?

Tho*_*que 21

Environment.SpecialFolder枚举映射到CSIDL,但没有CSIDLLocalLow文件夹中.所以你必须使用API ,KNOWNFOLDERID而不是SHGetKnownFolderPathAPI:

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);
Run Code Online (Sandbox Code Playgroud)

  • @Kiquenet GUID 是一个“KNOWNFOLDERID”常量(请参阅链接)。`Dump` 是 [LinqPad](https://www.linqpad.net/) 中用于显示值的方法。 (2认同)