我有一个程序可以查找以前安装的依赖项。不幸的是,它几乎可以安装在任何地方(包括程序文件或嵌套在C:/上任意文件夹中的6-7级深层),但有几个例外......
它永远不应该在Windows或Users目录中。由于这些通常非常大(并且我不需要抓取用户路径),因此我想将它们从扫描中排除。
我知道我可以使用Environment.GetFolderPath(Environment.SpecialFolder.UserProfile)
来获取当前用户个人资料的路径,但是有一种通用的方法来获取root用户文件夹(C:\Users
在我的机器上)吗?
我的工作计划是获取当前用户个人资料的父文件夹,但我不确定是否会出现这样的边缘情况,而这种情况并不总能给出正确的结果?
答案 0 :(得分:3)
.NET中没有任何东西可以做到(据我所知)。但是,如果您要定位Vista或更新版本,则可以通过P / Invoke SHGetKnownFolderPath
internal class Program
{
private static void Main(string[] args)
{
Console.WriteLine(GetFolderOfUsers());
Console.ReadLine();
}
private static string GetFolderOfUsers()
{
if (Environment.OSVersion.Version.Major >= 6)
{
IntPtr pPath;
var code = SHGetKnownFolderPath(new Guid("0762D272-C50A-4BB0-A382-697DCD729B80"), //Guid of FOLDERID_UserProfiles, defaults to %SystemDrive%\Users
0, IntPtr.Zero, out pPath);
string s = System.Runtime.InteropServices.Marshal.PtrToStringUni(pPath);
System.Runtime.InteropServices.Marshal.FreeCoTaskMem(pPath);
return s;
}
else
{
throw new NotSupportedException("You must be using Vista or newer");
}
}
[DllImport("shell32.dll")]
static extern int SHGetKnownFolderPath(
[MarshalAs(UnmanagedType.LPStruct)] Guid rfid,
uint dwFlags,
IntPtr hToken,
out IntPtr pszPath // API uses CoTaskMemAlloc
);
}