【问题标题】:List EVERYTHING in Desktop folder列出桌面文件夹中的所有内容
【发布时间】:2013-01-28 22:00:33
【问题描述】:

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

所以我这样做了:

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

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

【问题讨论】:

  • 您也需要检查文件夹。
  • 是的,很抱歉忘记提及 - 我也实施了该检查。
  • 您还需要检查公共用户(或 XP 中的所有用户)桌面上的项目。
  • 我认为在 XP 中您需要手动添加 All Users/Desktop 文件夹。
  • 并非用户桌面上的所有内容都表示为文件系统上的文件或目录。你也想要“虚拟”文件,比如回收站吗?

标签: c# windows desktop c#-2.0


【解决方案1】:

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

在 .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();
}

【讨论】:

  • 先生,这正是我要找的!谢谢!
【解决方案2】:

你还需要扫描这个目录:

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

    • 硬编码这样的路径不是一个好方法,因为如果用户移动该文件夹,它就不起作用。使用 SpecialFolders 枚举是正确的方法。
    • @JohnKoerner - 非常好的观点。最好知道默认值是什么,这样您就可以手动检查是否存在问题。
    【解决方案4】:

    如果你想获得所有的 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);
        }
    

    【讨论】:

      【解决方案5】:

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

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

      【讨论】:

        猜你喜欢
        • 2023-03-21
        • 1970-01-01
        • 2011-08-29
        • 2019-09-03
        • 1970-01-01
        • 1970-01-01
        • 2020-07-02
        • 1970-01-01
        • 2010-11-10
        相关资源
        最近更新 更多