在Desktop文件夹中列出所有内容

时间:2013-01-28 22:00:33

标签: c# windows desktop c#-2.0

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

所以我这样做:

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计算机。

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

5 个答案:

答案 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)

如果您想获取所有桌面项目,则必须检查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);
    }

答案 4 :(得分:0)

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

如果要使用Windows对桌面项执行的相同列表,则需要调用SHGetDesktopFolder并在生成的对象上调用EnumObjects。我不认为.NET Base Class库暴露了这个功能,但我确信有人已经编写了一个包装器来执行所有p / invoke繁重的工作。在pinvoke.net上已经提供了一个瘦包装器(接口声明已转换为C#)