我正在使用C#ASP.NET應用程序我有文件夾名稱xyz,並在此文件夾中某些文件存儲爲像jpg,doc等與他們的具體名稱。保存文件重複搜索
但是,當我添加一個文件已經存在於此文件夾,但保存在不同的名稱。
我想問一下如何才能找到這樣的文件,名稱不同但實際上是一樣的?
我正在使用C#ASP.NET應用程序我有文件夾名稱xyz,並在此文件夾中某些文件存儲爲像jpg,doc等與他們的具體名稱。保存文件重複搜索
但是,當我添加一個文件已經存在於此文件夾,但保存在不同的名稱。
我想問一下如何才能找到這樣的文件,名稱不同但實際上是一樣的?
你的問題很難理解,但我認爲你問如何識別重複文件:具有相同內容的不同文件。要做到這一點
的一種方式是進行散列每個文件的內容(使用散列函數,如SHA-1),並將結果存儲在Dictionary
,使用哈希作爲密鑰,以及文件名作爲一個List
值。如果兩個(或更多)文件具有相同的內容,它們將具有相同的散列值,因此它們將全部歸入字典中的相同密鑰下。在散列所有文件並將結果放入字典後,可以查看其值並檢查是否有任何列表包含多個項目。
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個文件是相同的文件,即使它們具有不同的文件名。
我想你可以通過字節讀取每個文件的字節,並比較:
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;
}
非常好的答案是非常有幫助的 – 2011-05-04 05:51:05
請給一個更有意義的標題你的問題。 – Oded 2011-05-02 06:57:07
請格式化你的問題,很難理解你的問題..! – Misam 2011-05-02 06:57:22
指定文件相同的條件。大小,創建日期,還有什麼? – abatishchev 2011-05-02 07:01:31