StreamReader 抱怨文件不存在,但确实存在

Posted

技术标签:

【中文标题】StreamReader 抱怨文件不存在,但确实存在【英文标题】:StreamReader complains that file does not exist, but it does 【发布时间】:2011-01-09 22:32:13 【问题描述】:

我有一个本地化的应用程序,可以在整个欧洲使用。

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

此操作在我的开发机器上运行良好,但在我用来测试其他操作系统的虚拟机上运行 - 例如法语、西班牙语等。

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

它说“'找不到文件 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 方法验证文件是否存在。 【参考方案1】:

好的,找到问题了。

确定操作系统正在将资源管理器中显示为“debug.txt”的文件读取为“debug.txt.txt”。

这是通过调用 System.IO.Directory.GetFiles 来列出目标目录中的文件来确定的。

如果我删除 .txt 扩展名,以便 Windows 资源管理器将其显示为“调试”,则找到该文件。

原来资源管理器在目标机器上隐藏了已知类型的文件扩展名。

仅供参考 ---------------------------------------------------------- ------------------

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

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

【讨论】:

非常感谢。我的 config.json 文件也有类似的问题。按照你的方法,发现它被读取为config.json.txt。【参考方案2】:

为确保您位于正确的文件夹中,请查看Environment.SpecialFolders

例如

string path = Environment.GetFolderPath(Environment.SpecialFolder.ProgramFiles);

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

【讨论】:

不幸的是,我不能以这种方式使用显式文件夹,因为最终用户可能会将应用程序安装在其他地方。这就是为什么我得到安装应用程序的目录路径(参见编辑)。另外,我检查了目标机器上的文件夹是否名为 Program Files。【参考方案3】:

我也会尝试使用

File.Exists()

在打开它之前。还有一点建议是使用

Path.Combine()

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

【讨论】:

小心使用 Path.Combine 如果有任何用户输入的机会:***.com/q/53102/522859 谢谢克里斯,确实,可能需要支票!【参考方案4】:

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

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

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

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

【讨论】:

【参考方案5】:

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

【讨论】:

以上是关于StreamReader 抱怨文件不存在,但确实存在的主要内容,如果未能解决你的问题,请参考以下文章

C# 只读第一行,使用压缩文本文件的 StreamReader

使用语句 FileStream 和/或 StreamReader - Visual Studio 2012 警告

使用语句 FileStream 和/或 StreamReader - Visual Studio 2012 警告

StreamReader.ReadLine() 不消耗流

当 Stream.Read() 存在时,StreamReader 的目的是啥?

FileStream读写文件StreamWriter 和 StreamReader