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

C#技术问题:Browse Folder选中目录后BinaryReader无法读取文件

解决BinaryReader无法读取目录下文件的问题

看来你是把目录路径直接传给BinaryReader了——这肯定行不通!BinaryReader需要的是单个文件的可读流,可不是文件夹路径。咱们一步步把这个问题捋清楚:

核心问题分析

你提到的BinaryReader NDSRead2 = new BinaryReader(file)报错,大概率是因为file变量存的是选中的目录路径,或是DirectoryInfo对象,而非具体的文件路径/文件流。BinaryReader完全不知道该怎么处理文件夹,自然会抛出错误。

修正步骤与示例代码

下面是完整的实现逻辑,从选目录、遍历文件、读取指定位置数据到写入TXT:

using System.IO;
using System.Windows.Forms; // 若为WinForms项目需引入

// 1. 弹出文件夹选择框获取目标目录
using (FolderBrowserDialog folderDialog = new FolderBrowserDialog())
{
    if (folderDialog.ShowDialog() == DialogResult.OK)
    {
        string targetDirectory = folderDialog.SelectedPath;
        string outputTxtPath = "读取结果.txt";

        // 2. 遍历目录下所有文件(可加后缀过滤,比如"*.nds")
        foreach (string filePath in Directory.GetFiles(targetDirectory))
        {
            // 跳过非文件项(GetFiles理论只返回文件,做个保险)
            if (!File.Exists(filePath)) continue;

            // 3. 打开文件流,创建BinaryReader读取数据
            using (FileStream fileStream = new FileStream(filePath, FileMode.Open, FileAccess.Read))
            using (BinaryReader ndsReader = new BinaryReader(fileStream))
            {
                // 替换X为你要读取的字节偏移位置
                int targetPosition = X;

                // 检查文件长度是否足够,避免越界报错
                if (fileStream.Length <= targetPosition)
                {
                    using (StreamWriter sw = new StreamWriter(outputTxtPath, true))
                    {
                        sw.WriteLine($"【错误】文件 {Path.GetFileName(filePath)} 长度不足,无法读取位置 {targetPosition}");
                    }
                    continue;
                }

                // 4. 跳转到指定位置并读取数据(示例读1字节,可按需改ReadInt32/ReadString等)
                ndsReader.BaseStream.Seek(targetPosition, SeekOrigin.Begin);
                byte targetData = ndsReader.ReadByte();

                // 5. 将结果追加写入TXT
                using (StreamWriter sw = new StreamWriter(outputTxtPath, true, System.Text.Encoding.UTF8))
                {
                    sw.WriteLine($"文件:{Path.GetFileName(filePath)} | 位置 {targetPosition} 数据:{targetData:X2}(十六进制) / {targetData}(十进制)");
                }
            }
        }
    }
}

关键细节提醒

  • 文件过滤:如果只需要处理特定类型的文件,比如.nds,可以把Directory.GetFiles(targetDirectory)改成Directory.GetFiles(targetDirectory, "*.nds")
  • 资源释放:所有流对象(FileStream、BinaryReader、StreamWriter)都要用using包裹,确保用完自动释放资源,避免内存泄漏
  • 越界防护:必须判断文件长度是否大于目标位置,否则会触发EndOfStreamException
  • 编码设置:写入TXT时指定UTF-8编码,避免中文乱码问题

常见错误排查

如果还是报错,可以检查这几点:

  • 确认file变量是具体的文件路径,而非目录路径
  • 检查目标文件是否被其他进程占用(比如正在被打开编辑)
  • 确认目标位置X的单位是字节,不要和其他单位混淆

内容的提问来源于stack exchange,提问作者Lord FoxCat

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 09:09:37