我正在使用一个C#ASP.NET应用程序,我有文件夹名称xyz,在这个文件夹中,一些文件以jpg,doc等存储,并以其特定名称存储。
但是当我添加一个已存在于此文件夹中但以不同名称保存的文件时。
我想问一下如何找到名称不同但实际上相同的文件?
答案 0 :(得分:3)
您的问题很难理解,但我认为您正在询问如何识别重复文件:具有相同内容的不同文件。
这样做的一种方法是散列每个文件的内容(使用散列函数,如SHA-1)并将结果存储在Dictionary
中,使用散列作为键,以及{{{ 1}}文件名作为值。如果两个(或更多)文件具有相同的内容,它们将具有相同的哈希值,因此它们将全部归入字典中的相同密钥。在对所有文件进行哈希处理并将结果放入字典后,您可以查看其值并检查是否有任何列表包含多个项目。
答案 1 :(得分:2)
void SaveFile(string fileName)
{
string folderPath = Server.MapPath("~/xyz");
DirectoryInfo dirInfo = new DirectoryInfo(folderPath);
FileInfo fileInfo = new FileInfo(fileName);
// comparison algorithm based on size and creation date
bool exists = (from fi in dirInfo.EnumerateFiles(folderPath)
where fi.Size == fileInfo.Size &&
fi.CreationTimeUtc == fileInfo.CreationTimeUtc
select fi).Any();
// comparison algorithm based on hash
string fileHash = ComputeHash(fileInfo.FullPath);
bool exists = (from fi in dirInfo.EnumerateFiles(folderPath)
where String.Equals(
ComputeHash(fi.FullPath),
fileHash,
StringComparison.Ordinal)
select fi).Any();
}
示例如何获取文件的md5哈希值see more。
string ComputeHash(string fileName)
{
byte[] bytes;
using (Stream stream = new FileStream(fileName, FileMode.Open))
{
MD5 md5 = new MD5CryptoServiceProvider();
bytes = md5.ComputeHash(stream);
}
StringBuilder sb = new StringBuilder(retVal.Length);
for (int i = 0; i < bytes.Length; i++)
{
sb.Append(bytes[i].ToString("x2"));
}
return sb.ToString();
}
答案 2 :(得分:0)
如果我正确理解了这个问题,你想知道2个文件是同一个文件,即使它们有不同的文件名。
我想您可以逐字节读取每个文件并进行比较:
public static bool AreEqual(string f1, string f2)
{
var fi1 = new FileInfo(f1);
var fi2 = new FileInfo(f2);
// first check that they are the same size, obviously a pre-req for them being equal
if (f1.Length != f2.Length)
{
return false;
}
var sr1 = new FileStream(f1, FileMode.Open);
var sr2 = new FileStream(f2, FileMode.Open);
for (int i = 0; i < f1.Length; i++)
{
byte[] left = new byte[1];
byte[] right = new byte[1];
sr1.Read(left, i, 1);
sr2.Read(right, i, 1);
if (left[0] != right[0])
{
return false;
}
}
return true;
}