找到用户'路径

时间:2014-05-27 20:32:37

标签: .net user-profile special-folders

我有一个程序可以查找以前安装的依赖项。不幸的是,它几乎可以安装在任何地方(包括程序文件或嵌套在C:/上任意文件夹中的6-7级深层),但有几个例外......

它永远不应该在Windows或Users目录中。由于这些通常非常大(并且我不需要抓取用户路径),因此我想将它们从扫描中排除。

我知道我可以使用Environment.GetFolderPath(Environment.SpecialFolder.UserProfile)来获取当前用户个人资料的路径,但是有一种通用的方法来获取root用户文件夹(C:\Users在我的机器上)吗?

我的工作计划是获取当前用户个人资料的父文件夹,但我不确定是否会出现这样的边缘情况,而这种情况并不总能给出正确的结果?

1 个答案:

答案 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
         );
}