所以这里的东西…我正在做一个小应用程序,应该能够在用户桌面上列出一切 – 包括快捷方式。
所以我这样做了:
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项目,你将不得不检查DesktopDirectory
和CommonDesktopDirectory
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#)