今天我遇到了一个非常奇怪的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:
我放弃了。我很确定我在某个地方犯了一个错误(我不认为这可能是这个巨大的错误,没有其他人注意到)但是无法抓住它在哪里。我过滤文件,这应该工作。谢谢大家的帮助! :)
答案 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)));
}
}