验证 c# Embedded Resource 是否与文件匹配
Verify that c# Embedded Resource matches file
我知道这可能是一个没有'right'答案的问题
我有一个 C# windows 应用程序,它在程序集中包含一个嵌入式资源。我一直在尝试想出一种方法来比较我的资源流的内容,以确定该流的内容是否与文件系统上的特定文件匹配。
例如
using(var resourceStream = Assembly.GetExecutingAssembly().GetManifestResourceStream(@"Manifest/Resource/Path/thing.exe"))
using(var fileStream = new FileStream(@"File/System/Path/thing.exe", FileMode.Read))
// Compare Contents (thing.exe may be an older version)
if(CompareStreamContents(resourceStream, fileStream))
{
/* Do a thing */
}
else
{
/* Do another thing*/
}
有没有比简单地逐字节比较更好的方法?想法? (提前致谢!)
根据我的评论:
private bool CompareStreamContents(Stream resourceStream, Stream fileStream)
{
var sha = new SHA256CryptoServiceProvider();
var hash1 = Convert.ToBase64String(sha.ComputeHash(ReadToEnd(resourceStream)));
var hash2 = Convert.ToBase64String(sha.ComputeHash(ReadToEnd(fileStream)));
return hash1 == hash2;
}
private byte[] ReadToEnd(Stream stream)
{
var continueRead = true;
var buffer = new byte[0x10000];
var ms = new MemoryStream();
while (continueRead)
{
var size = stream.Read((byte[])buffer, 0, buffer.Length);
if (size > 0)
{
ms.Write(buffer, 0, size);
}
else
{
continueRead = false;
}
}
return ms.ToArray();
}
如果您计划在比较后对流执行其他操作,您可能需要在从比较方法返回之前将流位置设置回原点。
我知道这可能是一个没有'right'答案的问题
我有一个 C# windows 应用程序,它在程序集中包含一个嵌入式资源。我一直在尝试想出一种方法来比较我的资源流的内容,以确定该流的内容是否与文件系统上的特定文件匹配。
例如
using(var resourceStream = Assembly.GetExecutingAssembly().GetManifestResourceStream(@"Manifest/Resource/Path/thing.exe"))
using(var fileStream = new FileStream(@"File/System/Path/thing.exe", FileMode.Read))
// Compare Contents (thing.exe may be an older version)
if(CompareStreamContents(resourceStream, fileStream))
{
/* Do a thing */
}
else
{
/* Do another thing*/
}
有没有比简单地逐字节比较更好的方法?想法? (提前致谢!)
根据我的评论:
private bool CompareStreamContents(Stream resourceStream, Stream fileStream)
{
var sha = new SHA256CryptoServiceProvider();
var hash1 = Convert.ToBase64String(sha.ComputeHash(ReadToEnd(resourceStream)));
var hash2 = Convert.ToBase64String(sha.ComputeHash(ReadToEnd(fileStream)));
return hash1 == hash2;
}
private byte[] ReadToEnd(Stream stream)
{
var continueRead = true;
var buffer = new byte[0x10000];
var ms = new MemoryStream();
while (continueRead)
{
var size = stream.Read((byte[])buffer, 0, buffer.Length);
if (size > 0)
{
ms.Write(buffer, 0, size);
}
else
{
continueRead = false;
}
}
return ms.ToArray();
}
如果您计划在比较后对流执行其他操作,您可能需要在从比较方法返回之前将流位置设置回原点。