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