C# 获取每个用户的SpecialFolder.MyDocuments文件夹

C# 获取每个用户的SpecialFolder.MyDocuments文件夹,c#,.net,windows,service,C#,.net,Windows,Service,我的机器上正在运行windows服务。如何获取每个用户的MyDocuments文件夹 例如: 对于Windows XP,我必须获得以下列表: C:\Documents and Settings\User1\My Documents C:\Documents and Settings\User2\My Documents 对于Windows 10,我必须获取以下列表: C:\Users\User1\Documents\ C:\Users\User2\Documents\ 如何获取这些列

我的机器上正在运行windows服务。如何获取每个用户的MyDocuments文件夹

例如:

对于Windows XP,我必须获得以下列表:

  • C:\Documents and Settings\User1\My Documents
  • C:\Documents and Settings\User2\My Documents
对于Windows 10,我必须获取以下列表:

  • C:\Users\User1\Documents\

  • C:\Users\User2\Documents\

如何获取这些列表?

我建议使用文件夹,然后只列出文件夹(针对每个用户)


这不是一个好主意,您不能硬编码“Documents”字符串。也可以将这些特殊文件夹移到配置文件目录之外。理论上,是的,你是对的。稍后我将编辑此答案以获得documents文件夹的实际名称。documents文件夹可以有每个用户的自定义名称,没有真正的通用名称。正如您所说,可以有。在新机器上,它们都将位于%userpofile%目录中,名称为“documents”或“mydocuments”。问题未指定您正在描述的行为。我已将文件夹从C:\Users\Admin\Documents\移动到D:\Abracadabra,但无法从Windows服务获取“D:\Abracadabra”:-(
// getUserProfilesPath() is a method from https://stackoverflow.com/a/41752173/3179310
string path = getUserProfilesPath();
// now use WMIC to get all users on the local machine
SelectQuery query = new SelectQuery("Win32_UserAccount");
ManagementObjectSearcher searcher = new ManagementObjectSearcher(query);
foreach (ManagementObject result in searcher.Get())
{
    // and check if their folder exists
    if(Directory.Exists(Path.Combine(path, result["Name"])))
    {
        // user folder exists so now check if it has Documents folder
        if(DirectoryExists(Path.Combine(path, result["Name"], "Documents")))
        {
            DirectoryInfo userDocuments = new DirectoryInfo(Path.Combine(path, result["Name"], "Documents"));
            // userDocuments is now a directory info of that user's documents folder
        }
    }
}