奇怪的C#Directory.GetFiles错误

时间:2012-06-15 18:28:42

标签: c# .net xna xna-3.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(以及另外四款带有win7的人的电脑),这项工作就像它应该的那样。

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

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

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

我知道哪里出错了?

winform区域中的openfiledialog,而文件在另一个DLL中搜索并打开,这是一个完全不同的类,采用私有的,不可接受的方法 - 它们甚至不应该以任何方式进行通信!我不知道我该怎么回到那个文件名。

编辑:

我认为我没有明白我的问题(抱歉:)。

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

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

编辑2:

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

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

启动Housecreator.exe 单击“加载”按钮。 选择“Suburb house 1.sbm”

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

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

将需要XNA框架3.1,并且还需要.NET 3.5来试用该程序。如果用户使用“加载”选项,则只会弹出错误。

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

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

编辑4:

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

1 个答案:

答案 0 :(得分: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))); 
    }
}