我想从exe文件中读取数据。 在java上我从头到尾阅读exe完美, 在c#上发髻我无法读取所有文件。 文件lenth为true但结果只显示exe文件头
string fileLoc = filePaths[0];
FileStream fs = new FileStream(fileLoc, FileMode.Open, FileAccess.Read, FileShare.Read);
BinaryReader br = new BinaryReader(fs);
byte[] bin = br.ReadBytes(Convert.ToInt32(fs.Length));
foreach(byte b in bin){
Console.Write((char)b);
}
fs.Close();
输出只是exe的头:MZP
答案 0 :(得分:1)
无法重现:
string fileLoc = //my path to git.exe
FileStream fs = new FileStream(fileLoc, FileMode.Open, FileAccess.Read, FileShare.Read);
BinaryReader br = new BinaryReader(fs);
byte[] bin = br.ReadBytes(Convert.ToInt32(fs.Length));
foreach (byte b in bin)
{
Console.Write((char)b);
}
fs.Close()
它会写入所有数据。
但我在你的代码中看到很多问题:
1)永远不要使用这种不太好的方式处理文件(如果错误发生的文件不会关闭)重写:
string fileLoc = //my path to git.exe
using(FileStream fs = new FileStream(fileLoc, FileMode.Open, FileAccess.Read, FileShare.Read)) {
BinaryReader br = new BinaryReader(fs);
byte[] bin = br.ReadBytes(Convert.ToInt32(fs.Length));
foreach (byte b in bin)
{
Console.Write((char)b);
}
} // no more explicit close required, but it will closed with guarantee
2)没有错误,但在C#中,最好使用var(在c ++中分析为auto)
using(var fs = new FileStream(fileLoc, FileMode.Open, FileAccess.Read, FileShare.Read)) {
var br = new BinaryReader(fs);
var bin = br.ReadBytes(Convert.ToInt32(fs.Length));
foreach (var b in bin)
{
Console.Write((char)b);
}
} //it still strong typed, but type referenced only once at right side of assigment
3)不需要使用转换为显式可转换类型(long-> int)
var bin = br.ReadBytes((int)fs.Length);
4)我不知道为什么只有MZP是在你的情况下编写的,但可以想象如果你将字节转换为char你会得到许多不可打印的符号,包括输出中的\ r \ n \ f等等 - 您的混凝土终端将如何反应? - 我不知道
5)如果你打印(char)b只是为了测试bin
- 为什么这么糟糕 - 为什么你不能简单地测试bin.Length或为什么你打印(char)b
而不是b+" "
?否则,如果你真的想将字节打印到控制台 - 无论如何这都是坏主意 - 看看(4)
6)为什么选择BinaryReader?如果你只想阅读全部
using(var fs = new FileStream(fileLoc, FileMode.Open, FileAccess.Read, FileShare.Read)) {
var bin = new byte[(int)fs.Length];
// u can use usual stream pattern
int l=0; while((l+=fs.Read(bin,t,bin.Length-t))<bin.Length);
foreach (var b in bin)
{
Console.Write((char)b);
}
}