You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 12:52:36