我正在比较两个文件,其中一个文件可能已添加或删除项目。我正在检查两个文件之间是否存在差异,如果存在差异,那么无论是否添加或删除了记录,这些差异是什么。我想退回那些记录(添加或删除)
有了我所拥有的,它告诉我文件是否已删除或添加了项目,但它没有返回已添加或删除的项目。对我所缺少的任何帮助将不胜感激。
foreach (ExcelRow rowA in fileA.excelRows)
{
if (!fileB.ContainsHash(rowA.rowHash))
{
MessageBox.Show("Files are NOT the same. Data was REMOVED.\n" + rowA.ToString());
}
}
foreach (ExcelRow rowB in fileB.excelRows)
{
if (!fileA.ContainsHash(rowB.rowHash))
{
MessageBox.Show("Row added" + rowB.ToString());
}
}
public List<ExcelRow> excelRows = new List<ExcelRow>();
public bool ContainsHash(byte[] hashToLook)
{
bool found;
found = false;
foreach (ExcelRow eRow in excelRows)
{
found = EqualHash(eRow.rowHash, hashToLook);
if (found)
{
break;
}
}
return found;
}
public static bool EqualHash(byte[] hashA, byte[] hashB)
{
bool bEqual ;
int i ;
bEqual = false;
if (hashA.Length == hashB.Length)
{
i = 0;
while ((i < hashA.Length) && (hashA[i] == hashB[i]))
{
i++ ;
}
if (i == hashA.Length)
{
bEqual = true;
}
}
return bEqual ;
}
阅读文件:
public ExcelInfo ReadExcel(OpenFileDialog openFileDialog)
{
var _excelFile = new ExcelQueryFactory(openFileDialog.FileName);
var _info = from c in _excelFile.WorksheetNoHeader() select c;
ExcelRow excelRow;
ExcelInfo resp;
resp = new ExcelInfo();
foreach (var item in _info)
{
excelRow = new ExcelRow();
excelRow.lstCells.Add(item.ElementAt(0));
excelRow.lstCells.Add(item.ElementAt(1));
excelRow.lstCells.Add(item.ElementAt(2));
excelRow.lstCells.Add(item.ElementAt(3));
excelRow.lstCells.Add(item.ElementAt(4));
excelRow.lstCells.Add(item.ElementAt(5));
excelRow.lstCells.Add(item.ElementAt(6));
excelRow.lstCells.Add(item.ElementAt(7));
excelRow.lstCells.Add(item.ElementAt(8));
excelRow.lstCells.Add(item.ElementAt(9));
excelRow.lstCells.Add(item.ElementAt(10));
excelRow.lstCells.Add(item.ElementAt(11));
excelRow.lstCells.Add(item.ElementAt(12));
excelRow.CalculateHash();
resp.excelRows.Add(excelRow);
}
return resp;
}
计算哈希:
public void CalculateHash()
{
byte[] rowBytes;
byte[] cellBytes;
int pos;
int numRowBytes;
numRowBytes = 0;
foreach (string cellText in lstCells)
{
numRowBytes += NumBytes(cellText);
}
//Allocate space to calculate the HASH of a single row
rowBytes = new byte[numRowBytes];
pos = 0;
//Concatenate the cellText of each row into a single byte array
foreach (string cellText in lstCells)
{
cellBytes = GetBytes(cellText);
System.Buffer.BlockCopy(cellBytes, 0, rowBytes, pos, cellBytes.Length);
pos = cellBytes.Length;
}
rowHash = new MD5CryptoServiceProvider().ComputeHash(rowBytes);
}
调试时:
if (!fileB.ContainsHash(rowA.rowHash))
fileB 包含三行,fileA 包含 4 行。
fileB = 3,rowA = fileA 中的第一行,(.rowHash) 为 byte[16]
当我继续使用 ContainHash 方法时,byte[] hashToLook = 16 - 这不应该是 rowA 吗?
excelRows = 3 (fileB)
然后 EqualHash(eRow.rowHash, hashToLook) 是(fileA 中的第一行,字节 [16])
我在 rowA 中传递错了吗?