StreamReader抱怨文件不存在,但实际上存在

13

我有一个面向欧洲使用的本地化应用程序。

我有一个菜单选项,可以从磁盘加载文件。

这个操作在我的开发机上正常工作,但在我用来测试其他操作系统(如法语、西班牙语等)的虚拟机上却无法工作。

当StreamReader尝试打开文件时,会生成FileNotFoundException。

它说“'Could not find the file C:\Program Files\MyCompany\MyTool\bin\Files\debug.txt'”

问题是,文件确实存在,位于正确的位置,并且具有正确的文件名。

目标(法语)操作系统上的目录名称与开发机器上的相同。

有什么想法吗?

string ourPath =   System.IO.Path.GetDirectoryName(System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName);

           try
        {
            System.IO.StreamReader sr = System.IO.File.OpenText(ourPath + @"\bin\Files\debug.txt");
            string input = null;
            while ((input = sr.ReadLine()) != null)
            {
                m_text.Append(input);
            }
            sr.Close();
        }
        catch (System.IO.FileNotFoundException)
        {
            MessageBox.Show("LoadDebugOptions: File Not Found: " + ex.Message);
        }

尝试使用File.Exists方法来验证文件是否存在。 - Faisal
5个回答

30

好的,找到了问题。

通过调用 System.IO.Directory.GetFiles 方法列出目标目录中的文件,发现操作系统将资源管理器中显示为“debug.txt” 的文件实际上是“debug.txt.txt”。

如果我移除 .txt 扩展名,使得资源管理器将其显示为“debug”,那么该文件就会被找到。

事实证明,资源管理器在目标计算机上隐藏了已知类型的文件扩展名。

提示 ---------------------------------------------

打开资源管理器,选择“工具”->“文件夹选项”,然后选择“查看”选项卡。

向下滚动并取消选中“隐藏已知文件类型的扩展名”。


非常感谢。我的config.json文件也遇到了类似的问题。按照您的方法,发现它被读取为config.json.txt。 - Kaane Guji

5
为了确保您在正确的文件夹中,查看Environment.SpecialFolders
例如:
string path = Environment.GetFolderPath(Environment.SpecialFolder.ProgramFiles);

然后还要检查特定文件的权限。


很遗憾,我不能以这种方式使用显式文件夹,因为最终用户可能会在其他地方安装应用程序。这就是为什么我获取应用程序安装路径的目录路径(请参见编辑)。 此外,我已经检查了目标机器上的文件夹名称为“Program Files”。 - Kildareflare

4
我会尝试使用。
File.Exists()

在打开它之前,请确保备份。另外一个小建议是使用

Path.Combine()

当组合路径的两个部分时。


1
如果有任何用户输入的可能性,请小心使用Path.Combine:https://dev59.com/questions/2nVD5IYBdhLWcg3wNIvc - Chris Owens
1
谢谢Chris,确实可能需要进行检查! - Shimrod

1

也许这个前缀是错误的:C:\Program Files

例如,对于巴西葡萄牙语的Windows安装,该文件夹变成"C:\Arquivos de Programas\"; 您应该确保您的Windows安装没有相同的 "功能"。

如果示例代码在该文件夹内运行,则可以使用相对路径。

您还可以尝试使用ourPath = "%ProgramFiles%\MyCompany\MyTool\


1

这可能是由于安全异常,因为当前尝试读取的用户没有足够的权限。我遇到过很多次这种情况...


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接