所以这就是...... 我正在制作一个应该能够在用户桌面上列出所有内容的小应用程序 - 包括快捷方式。
所以我这样做:
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计算机。
编辑:我也忘了提到我已经在检查桌面上的文件夹了。
答案 0 :(得分:7)
您需要检查公共用户的桌面。
在.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();
}
答案 1 :(得分:2)
您还需要扫描此目录:
string filepath = Environment.GetFolderPath(Environment.SpecialFolder.CommonDesktopDirectory);
答案 2 :(得分:0)
当您查看(但不是代码)时,某些文件可能会显示,因为它们实际上位于共享桌面文件夹中。在Windows 7上,这是C:\Users\Public\Public Desktop
。在XP上我认为它是C:\Documents and Settings\All Users\Desktop
,但我现在无法检查它。
答案 3 :(得分:0)
如果您想获取所有桌面项目,则必须检查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);
}
答案 4 :(得分:0)
虽然许多项目来自所有用户桌面,但正如其他答案所述,这绝不会完成您的搜索。
如果要使用Windows对桌面项执行的相同列表,则需要调用SHGetDesktopFolder
并在生成的对象上调用EnumObjects
。我不认为.NET Base Class库暴露了这个功能,但我确信有人已经编写了一个包装器来执行所有p / invoke繁重的工作。在pinvoke.net上已经提供了一个瘦包装器(接口声明已转换为C#)