当前当我读取一个15Mb文件时,我的应用程序会经过一段内存。 请注意,在主代码的末尾,我将数据库中插入的数据与文件中的原始数组进行了比较。欢迎任何建议。需要优化此代码的建议
主要代码:
TestEntities entities = new TestEntities();
using (FileStream fileStream = new FileStream(fileName + ".exe", FileMode.Open, FileAccess.Read))
{
byte[] bytes = new byte[fileStream.Length];
int numBytesToRead = (int) fileStream.Length;
int numBytesRead = 0;
while (numBytesToRead > 0)
{
int n = fileStream.Read(bytes, numBytesRead, numBytesToRead);
if (n == 0)
break;
numBytesRead += n;
numBytesToRead -= n;
}
var query = bytes.Select((x, i) => new {Index = i, Value = x})
.GroupBy(x => x.Index/100)
.Select(x => x.Select(v => v.Value).ToList())
.ToList();
foreach (List<byte> list in query)
{
Binary binary = new Binary();
binary.Name = fileName + ".exe";
binary.Value = list.ToArray();
entities.AddToBinaries(binary);
}
entities.SaveChanges();
List<Binary> fileString = entities.Binaries.Where(b => b.Name == fileName + ".exe").ToList();
Byte[] final = ExtractArray(fileString);
if (Compare(bytes, final))
{
/// Some notification that was ok
}
}
比较方法:
public bool Compare(Byte[] array1,Byte[] array2)
{
bool isEqual = false;
if (array1.Count() == array2.Count())
{
for (int i = 0; i < array1.Count(); i++)
{
isEqual = array1[i] == array2[i];
if (!isEqual)
{
break;
}
}
}
return isEqual;
}
ExtractArray方法:
public Byte[] ExtractArray(List<Binary> binaries)
{
List<Byte> finalArray = new List<Byte>();
foreach (Binary binary in binaries)
{
foreach (byte b in binary.Value)
{
finalArray.Add(b);
}
}
return finalArray.ToArray();
}
比较大的二进制对象可以使用这里描述的方法来完成:http://stackoverflow.com/questions/968935/c-sharp-binary-file-compare – 2012-04-19 06:40:04
是你所做的一个字节用于两个字节的比较文件?你为什么要这样做? – IanNorton 2012-04-19 06:44:45
为什么不在数据库中存储文件的摘要,只是消化其他文件,而不是每次比较? – IanNorton 2012-04-19 06:45:31