【问题标题】:DirectoryInfo.GetFiles() Not returning all filesDirectoryInfo.GetFiles() 不返回所有文件
【发布时间】:2017-05-19 14:16:31
【问题描述】:

我只是在用我自己的文件夹浏览器做一些试验。我注意到当我查看 Windows 7 中的 System32 文件夹时,我得到了一些奇怪的结果。代码如下:

DataTable dt=new DataTable();
string Folder="C:\\Windows\\System32";
DirectoryInfo DI = new DirectoryInfo(Folder);
foreach (FileInfo FI in DI.GetFiles())
{
    DataRow Row = dt.NewRow();
    if(FI.Name== "accelerometerdll.DLL")
    {

    }
    Row["Name"] = FI.Name;
    Row["Created"] = FI.CreationTime;

    Row["Size"] = FI.Length;
    dt.Rows.Add(Row);
}
dataGridView1.DataSource = dt;

运行时,文件列表不完整。与 Windows 资源管理器相比,文件总数减少了 400 多个文件。

对名为“accelerometerdll.dll”的文件进行简单检查以尝试解决此问题。该文件绝对位于 System32 文件夹中。我可以在资源管理器中看到它,当我执行 DIR 时,我可以在命令窗口中看到它。然而它从未出现在我的数据表中。条件永远不会满足。它就像它根本看不见一样。我试过以管理员身份运行它,结果相同。

更令人不安的是,它确实显示了一个名为“12520437.cpx”的文件,而我在资源管理器或命令窗口中都看不到它。它似乎在 SysWOW64 文件夹而不是 System32 文件夹中???

我的主要目标是显示与资源管理器在我打开任何文件夹时显示的完全相同的文件。

有什么想法吗?

【问题讨论】:

  • 您的应用程序是 32 位应用程序吗?是 AnyCPU 但设置了“支持 32 位”标志吗?您是在使用您显示的代码(硬编码路径)还是在使用 Environment.GetSpecialFolder()?关于第二个问题: GetFiles() 返回所有文件,包括隐藏文件和受保护文件(默认情况下,在资源管理器中可能不可见)。关于您的测试:== 是区分大小写的比较。
  • @AdrianoRepetti 我正在使用如图所示的硬编码路径。是 任何 CPU 并且是 首选 32 位。没想到这些会产生影响(除了 GetSpecialFolders())。
  • 您的 32 位应用程序将始终看到重定向的路径。太多的应用程序硬编码了完整路径,然后你总是被重定向。
  • 如果您点击该链接,您会看到允许 32 位进程和 64 位进程访问相应位的内容,同时都认为他们正在访问一个名为C:\Windows\System32的文件夹。
  • 去掉“prefer 32 bit”,保留AnyCPU。

标签: c# .net windows


【解决方案1】:

有必要根据知情响应关闭首选 32 位编译器指令。

更多信息可在此处获得:

File System Redirector

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-10-19
    • 2017-10-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多