0

今天我遇到了一个非常奇怪的 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)));
}

此方法获取给定目录中的所有文件,在本例中为“Content\Textures\Houses\Roof”。错误出现了:这个目录中有三个文件(都带有 .xnb 扩展名)。在我的装有 win7 的 PC 上(以及其他四台装有 win7 的 PC)上,这项工作就像它应该的那样工作。

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

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

通过检查给定的后备文件是否具有 .XNB 扩展名,我能够克服这个错误,但这个错误真的让我感到奇怪。

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

winform区域中的openfiledialog,而文件搜索和打开另一个DLL,一个完全不同的类,在一个私有的,无法访问的方法中 - 他们甚至不应该以任何方式进行通信!我不知道我到底是怎么找回那个文件名的。

编辑:

我想我没有把我的问题说清楚(很抱歉:)。

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

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

编辑2:

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

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

启动 Housecreator.exe 单击“加载”按钮。选择“郊区房屋1.sbm”

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

这是应该弹出错误的步骤。该程序将在 (Content)\Textures\Houses\OuterWall 中搜索“Suburb house 1.sbm”文件(有时。主要针对 xp 用户,但有时也发生在我身上。但仅限于 Visual Studio 之外) .

将需要 XNA 框架 3.1,以及 .NET 3.5 来试用该程序。只有当用户使用“加载”选项时才会弹出错误。

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

我想不出为什么会发生这种情况。

编辑4:

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

4

1 回答 1

1

如果 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))); 
    }
} 
于 2012-06-15T19:38:05.460 回答