获取用户目录的路径

时间:2012-01-06 21:24:12

标签: c# .net environment-variables

如何从MS Vista上的Windows服务获取Users文件夹的路径? 我想到 C:\ Users 目录的路径,但它可能是不同的位置取决于系统本地化。

5 个答案:

答案 0 :(得分:11)

查看Environment.SpecialFolder Enumeration,例如

 Environment.GetFolderPath(Environment.SpecialFolder.CommonDesktopDirectory);

调整所需的特殊文件夹。但是,在阅读发现here的其他帖子时,如果您想要完全 c:\ users 而不是 c:\,则可能需要对字符串进行一些操作。例如,用户\ public

答案 1 :(得分:7)

System.Environment.SpecialFolder将允许您访问所需的所有文件夹,例如“我的文档”等。

如果您使用UserProfile SpecialFolder,那么应该为您提供用户下个人资料的路径。

string userPath = Environment.GetFolderPath(Environment.SpecialFolder.UserProfile);

答案 2 :(得分:2)

@Neil指出的最佳方法是将SHGetKnownFolderPath()FOLDERID_UserProfiles一起使用。但是,c#没有这个。但是,调用它并不难:

using System;
using System.Runtime.InteropServices;

namespace SOExample
{
    public class Main
    {
        [DllImport("shell32.dll")]
        static extern int SHGetKnownFolderPath([MarshalAs(UnmanagedType.LPStruct)] Guid rfid, uint dwFlags, IntPtr hToken, out IntPtr pszPath);

        private static string getUserProfilesPath()
        {
            // https://msdn.microsoft.com/en-us/library/windows/desktop/dd378457(v=vs.85).aspx#folderid_userprofiles
            Guid UserProfilesGuid = new Guid("0762D272-C50A-4BB0-A382-697DCD729B80");
            IntPtr pPath;
            SHGetKnownFolderPath(UserProfilesGuid, 0, IntPtr.Zero, out pPath);

            string path = System.Runtime.InteropServices.Marshal.PtrToStringUni(pPath);
            System.Runtime.InteropServices.Marshal.FreeCoTaskMem(pPath);
            return path;
        }

        static void Main(string[] args)
        {
            string path = getUserProfilesPath(); // C:\Users
        }
    }
}

答案 3 :(得分:1)

我看不到该函数暴露给.NET,但在C(++)中它将是

SHGetKnownFolderPath(FOLDERID_UserProfiles, ...)

答案 4 :(得分:0)

System.Environment.GetFolderPath(System.Environment.SpecialFolder.Personal)