5

所以事情就是这样......我正在制作一个小应用程序,它应该能够在用户桌面上列出所有内容 - 包括快捷方式。

所以我这样做了:

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 机器。

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

4

5 回答 5

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();
}
于 2013-01-28T22:06:44.127 回答
2

您还需要扫描此目录:

string filepath = Environment.GetFolderPath(Environment.SpecialFolder.CommonDesktopDirectory);
于 2013-01-28T22:06:44.217 回答
0

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

于 2013-01-28T22:07:24.907 回答
0

如果你想获得所有 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);
    }
于 2013-01-28T22:11:00.227 回答
0

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

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

于 2013-01-28T22:15:27.557 回答