gpt4 book ai didi

c# - Directory.EnumerateFiles 和 File.Exists 忽略 native DLL 文件

转载 作者:太空狗 更新时间:2023-10-30 01:24:28 29 4
gpt4 key购买 nike

环境:C#、.NET 4.0 和混合模式。

我有一个复杂的应用程序,其中包含多个第三方依赖项。当我们收到一些应用程序崩溃的报告时,我们添加了一些完整性检查,以通过遍历程序集依赖项来确保所有依赖项都存在。不幸的是,这不会检查我们的应用程序使用的 native DLL 文件是否存在。我们预期的解决方案是遍历所有 DLL 名称并确保至少有一个文件具有该名称作为健全性检查。

问题

Directory.EnumerateFiles() 和 File.Exists() 也看不到这些 native DLL。重现这个问题的代码就像教科书“如何列出文件”一样简单:

foreach(string file in
Directory.EnumerateFiles(Environment.CurrentDirectory, "*.dll"))
{
string entry = Path.GetFileName(file);
if (! RequiredFiles.Contains(entry))
{
/* Do error handling */
}
}

盯着我列出文件的目录,我可以看到我想要检测的文件。它们不会以任何方式标记为系统文件。然而,无论我是否有过滤器文本,都只列出了 .NET DLL 文件。我想更直接地重写这部分代码,但令人沮丧的是得到了相同的结果:

foreach(string dependency in RequiredFiles)
{
string fileName = Environment.CurrentDirectory + '\\' + dependency;
if(! File.Exists(fileName))
{ /* do error handling */ }
}

我得到了完全相同的结果。所有 native DLL 文件似乎对 .NET 都是不可见的。

问题

这是什么原因造成的?更重要的是,如果我什至无法在文件系统中看到原生 DLL 文件,我如何检测它们的存在?

最佳答案

  • 为您自己的 DLL 起一个名字,例如我的 super 漂亮库.dll。它可以只是一个重命名的文本文件。将其放入您正在查看的文件夹中。再次运行代码。查看是否列出了该名称。如果这不能说服您,请创建一个具有独特名称的小型 .NET 类库项目,并将其也放入目录中。

    Directory.EnumerateFiles 没有理由过滤 .NET DLL 而不是其他类型的 DLL,因此您不可能查看正确的目录。

  • 但如果是,请考虑您要查找的 DLL 是在顶级目录还是子目录中。 默认情况下,EnumerateFiles 仅列出顶级目录中的文件。要列出所有子目录中的所有文件,您需要使用 EnumerateFiles 的重载:

Directory.EnumerateFiles(目录, "*.dll", SearchOption.AllDirectories)

关于c# - Directory.EnumerateFiles 和 File.Exists 忽略 native DLL 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9217362/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com