在桌面文件夹中列出一切

所以这里的东西…我正在做一个小应用程序,应该能够在用户桌面上列出一切 – 包括快捷方式。

所以我这样做了:

string filepath = Environment.GetFolderPath(Environment.SpecialFolder.Desktop); DirectoryInfo d = new DirectoryInfo(filepath); foreach (var file in d.GetFiles()) { Console.WriteLine(file.Name); } 

这给了我以下几点:

  Spotify.lnk Desktop.ini 

但在我的桌面上,我可以看到这些:

 Spotify.lnk Desktop.ini Microsoft Office 2010 VLC Media Player 

所以我试图从Win32_ShortcutFile中取出一些WMI信息,没有任何运气。 (它列出了Windows Live等桌面上没有的东西。)

所以现在我有点无知

我希望这是有道理的!

任何指向正确的方向将是真棒!

干杯。

编辑:我忘了提及 – 目标节点是Windows Server 2008 SP1机器。

编辑:我也忘了提及,我已经检查在桌面上的文件夹。

您需要检查公共用户的桌面。

在.NET 4.0及以上版本中,您可以使用Environment.SpecialFolder.CommonDesktopDirectory特殊文件夹来获取该目录。

如果你没有改变它,你的机器上可能是C:\Users\Public\Desktop 。 如果你在那里看,你应该看到C:\Users\YourUserName\Desktop文件夹中缺少的文件。

如果您使用的是.net 3.5或更低版本,则CommonDesktopDirectory不存在于特殊文件夹枚举中。 如果是这种情况,您将需要使用Win32 API调用来获取文件夹路径。

 [DllImport("shfolder.dll", CharSet = CharSet.Auto)] private static extern int SHGetFolderPath(IntPtr hwndOwner, int nFolder, IntPtr hToken, int dwFlags, StringBuilder lpszPath); private const int MAX_PATH = 260; private const int CSIDL_COMMON_DESKTOPDIRECTORY = 0x0019; public static string GetAllUsersDesktopFolderPath() { StringBuilder sbPath = new StringBuilder(MAX_PATH); SHGetFolderPath(IntPtr.Zero, CSIDL_COMMON_DESKTOPDIRECTORY, IntPtr.Zero, 0, sbPath); return sbPath.ToString(); } 

你也需要扫描这个目录:

 string filepath = Environment.GetFolderPath(Environment.SpecialFolder.CommonDesktopDirectory); 

有些文件可能在您查看(但不是代码)时显示,因为它们实际上位于共享桌面文件夹中。 在Windows 7上,这是C:\Users\Public\Public Desktop 。 在XP上,我认为它是C:\Documents and Settings\All Users\Desktop ,但我现在无法检查。

如果你想得到所有destop项目,你将不得不检查DesktopDirectoryCommonDesktopDirectory

  var list = new DirectoryInfo(Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory)).GetFiles() .Concat(new DirectoryInfo(Environment.GetFolderPath(Environment.SpecialFolder.CommonDesktopDirectory)).GetFiles()) .Distinct(); foreach (var file in list) { Console.WriteLine(file.Name); } 

虽然许多项目来自所有用户桌面,正如其他答案中所解释的那样,但绝不会完成您的搜索。

如果要使用Windows对桌面项目所做的相同列表,则需要调用SHGetDesktopFolder并在生成的对象上调用EnumObjects 。 我不认为.NET基类库公开了这个功能,但我相信有人已经写了一个包装,所有的p / invoke繁重。 在pinvoke.net上已经提供了一个简单的包装器(接口声明转换为C#)