从Windows服务获取用户根目录

时间:2013-08-08 17:34:44

标签: c# .net windows

我有一个用C#编写的Windows服务。我需要在每个用户目录中添加一个文件。我怎样才能找到入路?我意识到这真的很愚蠢,但这正是我目前正在做的事情:

  if (Directory.Exists("C:\\Users"))
  {
    path = "C:\\Users";
  }
  else if (Directory.Exists("C:\\Documents and Settings"))
  {
    path = "C:\\Documents and Settings";
  }

我查看了特殊文件夹:http://msdn.microsoft.com/en-us/library/system.environment.specialfolder.aspx

他们似乎都没有回复我需要的东西。例如,ApplicationData正在返回System32目录的路径。我认为这是因为它作为Windows服务运行。我目前使用的代码适用于我所做的少数测试。看起来似乎应该有更智能(防错)的方式来获得这条路径。

另一个想法......也许有一个注册表项会给我我正在寻找的东西?嗯

3 个答案:

答案 0 :(得分:1)

我在Win7注册表中找到了这个。 XP看起来具有相同的注册表项,但值具有"所有用户"其中的个人资料。

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders]
"Common Desktop"="C:\\Users\\Public\\Desktop"
"Common Start Menu"="C:\\ProgramData\\Microsoft\\Windows\\Start Menu"
"CommonVideo"="C:\\Users\\Public\\Videos"
"CommonPictures"="C:\\Users\\Public\\Pictures"
"Common Programs"="C:\\ProgramData\\Microsoft\\Windows\\Start Menu\\Programs"
"CommonMusic"="C:\\Users\\Public\\Music"
"Common Administrative Tools"="C:\\ProgramData\\Microsoft\\Windows\\Start Menu\\Programs\\Administrative Tools"
"Common Startup"="C:\\ProgramData\\Microsoft\\Windows\\Start Menu\\Programs\\Startup"
"Common Documents"="C:\\Users\\Public\\Documents"
"OEM Links"="C:\\ProgramData\\OEM Links"
"Common Templates"="C:\\ProgramData\\Microsoft\\Windows\\Templates"
"Common AppData"="C:\\ProgramData"

答案 1 :(得分:0)

我可能没有完全理解你,但我认为你只需要获取你所在的位置,然后从中获取它。

Path.GetPathRoot(Assembly.GetEntryAssembly().Location);

<强>更新

special folders是您需要研究的内容。没有一个简单的go-here do-this因为你的问题不够详细。如果服务作为特定用户或系统运行,则会产生影响。此外,您没有指定它的使用方式,因此很重要。它是一个容纳配置文件与临时位置来写文件的地方vs其他人是否想要获取该文件夹?所有这些都很重要,如果你添加一些额外的细节,我会更新我的答案。

答案 2 :(得分:0)

X和密钥HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList怎么样?它指向我的PC上的ProfilesDirectory。只是不确定哪个Windows版本具有此密钥(7和10有)。