奇怪的 C# Directory.GetFiles 错误

本文关键字:GetFiles 错误 Directory | 更新日期: 2023-09-27 18:37:17

今天我遇到了一个非常奇怪的c#错误。

我写了一个小方法,它应该搜索和处理任何给定目录中所有 XNA 的 xnb 文件。在大多数计算机中,它工作得很好 - 预计有些情况(两个有XP的人报告了问题)。

我只能在win7上重现此错误一次(当然,在VC#之外)

这是方法:

files = Directory.GetFiles("Content''Textures''Houses''Roof");
for (int i = 0; i < files.Length; i++)
{
    string path = files[i].Substring(BasicUtils.FindsubString(files[i], "Textures")).Replace(".xnb", "");
    roofTextures.Add(DataCenter.AddTexture(DataCenter.Content.Load<Texture2D>(path)));
}

此方法获取给定目录中的所有文件,在本例中为"内容''纹理''房屋''屋顶"。错误来了:此目录中有三个文件(所有扩展名为.xnb)。在我装有 win7 的 PC(以及其他四台装有 win7 的 PC 上),这就像它应该的那样工作。

但是,当拥有win XP的人尝试运行此方法时,操作系统会返回4个文件 - 以及三个真正退出的文件,以及上次使用OpenFileDialog打开的一个文件(即使文件在完全不同的目录中,Directory.Getfiles也会像在该目录中一样返回它)。

当我想打开它时,该方法找不到该文件,并抛出异常。

我能够通过检查给定的返回文件是否具有.XNB扩展,但这个错误真的让我想知道。

知道我在哪里犯了错误吗?

在 winform 区域中打开文件对话框,而文件搜索并在另一个 DLL(一个完全不同的类)中打开,以私有的、无法访问的方法 - 它们甚至不应该以任何方式进行通信!我不知道我到底是如何取回那个文件名的。

编辑:

我想我没有把我的问题说清楚(对不起,:)。

所以,方法中的问题:当我使用 Directory.GetFiles(...) 时,它会返回三个真正在目录中的文件(三个 .xnb 文件)。但是对于某些用户(使用Windows XP),此方法会返回一个.sbm扩展名(我的程序使用的文件类型),该扩展名位于目录中。我搜索了很长时间,直到我发现:这个问题仅在他们使用 Openfiledialog 时弹出 - 当他们这样做时,Directory.GetFiles(...) 会返回以前打开的文件 - 但物理上不是。我能够解决这个问题,但仍然无法理解为什么会发生这种情况。我浏览了MSDN数据库,但我没有发现有关此类错误的任何信息。我试图在VS中重新创建错误,希望它能提供线索-但我无法做到。有一次问题也出现在我身上(来自win7),但由于它在VS之外,我无法调试。目前只有两个win XP用户报告,而它对使用win7的每个人都工作正常。

哦,我仔细检查了 - 该目录中没有隐藏文件(尤其是以前打开的文件)。里面只有三个所需的文件。

编辑 2:

下面是问题的链接,以及创建问题的步骤:

https://www.dropbox.com/s/4uv1hbvzkhpwprw/House%20Creator%20V2%20With%20error.zip

启动房屋创建者.exe单击"加载"按钮。选择"郊区房屋1.sbm"

加载后,单击"3D 渲染"按钮。

这是应该弹出错误的步骤。该程序将在(内容)''纹理''房屋''外墙中搜索"郊区房屋 1.sbm"文件(有时,主要是针对 xp 用户,但有时也会发生在我身上。但仅限于视觉工作室的外部)。

将需要XNA框架3.1和.NET 3.5来试用该程序。并且仅当用户使用"加载"选项时才会弹出错误。

编辑3:我连续三次收到错误。给定目录中没有额外的文件。现在它再次工作,没有任何明显的变化 O.o

我想知道为什么会发生这种情况。

编辑4:

我放弃了。我很确定我在某处犯了一个错误(我认为这可能是这个巨大的错误,而且还没有其他人注意到),但无法抓住它在哪里。我过滤了文件,这应该可以工作。谢谢大家的帮助!:)

奇怪的 C# Directory.GetFiles 错误

如果 Directory.GetFiles() 返回 4 个文件,则您指定为参数的目录中有 4 个文件。

如果它们是隐藏的、受保护的系统文件等,您可能不会在 Windows 资源管理器中看到它们。

无论如何,您的应用程序不应期望在给定文件夹中仅看到它所关注的文件,您无法控制它。

问题的解决方案是过滤掉您不关心的文件并忽略它们。

for (int i = 0; i < files.Length; i++) 
{ 
    if(files[i].EndsWith(".xnb"))
    {
        string path = files[i].Substring(BasicUtils.FindsubString(files[i], "Textures")).Replace(".xnb", ""); 
        roofTextures.Add(DataCenter.AddTexture(DataCenter.Content.Load<Texture2D>(path))); 
    }
}