2012-06-15 172 views
0

今天我遇到了一个非常奇怪的C#错误。奇怪的C#Directory.GetFiles错误

我写了一个小方法,它应该搜索并处理任何给定目录中的所有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(和另外四个使用win7的电脑),这项工作就像它应该的一样。

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

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

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

任何想法,我犯了一个错误?

在Winform区域中的openfiledialog,而在另一个DLL中搜索和打开文件,完全不同的类,在一个私人的,不可访问的方法 - 他们甚至不应该以任何方式沟通!我没有任何想法,我怎么回到那个文件名。

编辑:

我觉得我没有做我的问题明确(对不起,那:)。

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

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

编辑2:

这里是链接的问题,并创建问题的步骤:

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

启动Housecreator.exe 点击 “Load” 按钮。 选择“郊区房屋1.sbm”

当其加载时,单击“3D渲染”按钮。

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

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

编辑3:我在连续三次出错。给定目录内没有额外的文件。现在它再次工作,没有任何可见的变化O.o

从想法出发,为什么会发生这种情况。

编辑4:

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

+0

第一步是如果错误来自Directory.GetFiles或来自您自己的代码,则缩小范围。看起来你更有可能在“roofTextures”中添加了一些东西,但没有意识到它。 –

+0

什么例外和地点?这个fundemental信息如何失踪?难怪你无法调试! – banging

+0

想说什么可能会说:“抛出的异常在哪里?”......可以毫不侮辱地说。 – hometoast

回答

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))); 
    } 
} 
+0

是的,我使用了这种解决方案 - 但仔细检查,并说上述文件不存在。不是隐藏的,或者任何东西 - 它在物理上位于不同的目录中。我们使用Dropbox,其他人从同一个目录启动程序,打开相同的文件 - 虽然它为win7用户工作,但它并不适用于两个XP用户。 (我也使用了这种过滤方法,但我仍然无法理解这个问题)。 –