Определить местоположение 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;