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

我发现了一个使用以下示例:

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

一方面,它与c:users绑定(bind)在一起,而AppData\Local似乎有点脆弱。

我尝试使用
Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData)

但这给了我ojit_code,并且由于应用程序在其下运行的安全性限制,我需要LocalLow。它也为我的服务用户返回了空白(至少在连接到进程时)。

还有其他建议吗?

最佳答案

Environment.SpecialFolder枚举映射到 CSIDL ,但是CSIDL文件夹没有LocalLow。因此,您必须使用KNOWNFOLDERID 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);

10-06 14:32