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
相关产品推荐
相关产品推荐

