【发布时间】:2016-09-08 20:50:07
【问题描述】:
我查看了其他帖子,但没有找到解决此问题的方法。
public string Profile(string FileName,byte[] Search, uint align)
{
string Result = "";
Stream fs = File.OpenRead(FileName);
byte[] _Search = new byte[Search.Length];
uint check = 0;
byte Check_Zero;
for (uint i = 0; i < fs.Length; i++)
{
_Search = func.ReadBytes(FileName, i, _Search.Length);
if (func.ByteArrayCompare(_Search, Search))
{
check = i + align;
break;
}
}
for (uint i = 0; i < 50; i++)
{
Check_Zero = func.ReadByte(FileName, check);
if (Check_Zero == 0)
check++;
else
{
Result = func.ReadString(FileName, check);
break;
}
}
return Result;
}
我正在尝试读取两个不同的文件。从 9.52KB 的文件中读取时我没有任何问题,但是当我尝试从 1.00MB 的文件中读取时,我得到了 OutOfMemory 异常。
如果有帮助,这里是 ReadBytes();我使用的功能
public static byte[] ReadBytes(string filename, uint address, int length)
{
var buff = new byte[length];
Stream fs = File.OpenRead(filename);
BinaryReader b = new BinaryReader(fs);
b.BaseStream.Seek(address, SeekOrigin.Begin);
b.Read(buff, 0, length);//This is where it breaks.
return buff;
}
【问题讨论】:
-
对于初学者来说,为什么要打开两个流文件,为什么不对流使用
using()语句来正确处理它们?打开文件一次,从中读取,然后处理流。 -
Dispose完成后的流using初学者 -
其次,最好打开一个流并将其传递给
ReadBytes,而不是多次重新打开同一个文件。 -
您似乎正在为文件中的每个字节读取 Search.Length 字节 - 这不是一种有效的做事方式。将整个内容预先读入缓冲区并在其中搜索。
-
@BrandonPrintiss:我的意思是,如果你的文件是 1MB,那么你调用
func.ReadBytes一百万次,每次分配一个缓冲区,这是搜索模式的长度。是的,这些缓冲区确实会被垃圾收集,但不会马上。