如何在C#中使用StreamReader访问相对路径下的.dat文件
解决路径异常与文本文件读写优化方案
一、先解决DirectoryNotFoundException异常
问题核心有两点:一是相对路径的基准是程序运行目录(而非项目源码目录),二是StreamWriter不会自动创建不存在的父目录。
1. 提前创建目标目录
在读写文件前,先提取父目录路径并创建(如果不存在):
private readonly string _datFile = @"./AllResources/saveData/data.dat"; // 提取文件所在的目录路径 string directoryPath = Path.GetDirectoryName(_datFile); // 目录不存在则创建 if (!Directory.Exists(directoryPath)) { Directory.CreateDirectory(directoryPath); } // 执行后续读写操作
2. 确保文件被复制到运行目录
如果AllResources是项目源码中的文件夹,需在Visual Studio中设置data.dat的属性:
- 右键文件 → 属性 → 复制到输出目录:选择如果较新则复制或始终复制
编译后文件会被同步到程序运行目录的对应子文件夹,此时相对路径才能正确访问。
3. 调试时可使用绝对路径
不确定相对路径基准时,可直接用项目内的绝对路径(发布时需调整或改用配置文件):
// 示例:假设项目根目录为D:\MyGameProject private readonly string _datFile = @"D:\MyGameProject\AllResources\saveData\data.dat";
二、替代StreamWriter的更简洁方案
对于简单纯文本读写,C#的File类静态方法比StreamReader/StreamWriter更易用,无需手动管理流的生命周期:
1. 读取文本内容
string data = null; try { // 读取全部文本,也可用File.ReadAllLines逐行读取 data = File.ReadAllText(_datFile); } catch (FileNotFoundException) { // 文件不存在时进入创建逻辑 }
2. 写入文本内容
// 直接写入内容,会自动创建文件(但不会创建父目录,仍需提前处理目录) File.WriteAllText(_datFile, "0");
完整优化代码示例
private readonly string _datFile = @"./AllResources/saveData/data.dat"; string data = null; string directoryPath = Path.GetDirectoryName(_datFile); // 确保目录存在 if (!Directory.Exists(directoryPath)) { Directory.CreateDirectory(directoryPath); } try { data = File.ReadAllText(_datFile); } catch (FileNotFoundException) { // 文件不存在,直接创建并写入默认值 File.WriteAllText(_datFile, "0"); return; } // 内容为空时重置为默认值 if (string.IsNullOrEmpty(data)) { File.WriteAllText(_datFile, "0"); }
补充说明
File类方法内部已封装流的打开、关闭与异常处理,适合简单文本读写场景。- 若处理大文件或需要逐行读写,
StreamReader/StreamWriter仍是更优选择,此时记得提前创建父目录。
内容的提问来源于stack exchange,提问作者AuthorBrotherGames
相关产品推荐
相关产品推荐

