導航:首頁 > 源碼編譯 > 文件夾比較演算法

文件夾比較演算法

發布時間:2022-07-13 21:05:23

① 文件演算法

主要是看文件格式,像rmvb等格式都是已經壓縮過的了,再壓空間不大,還有就是獨立格式文件,一般系統無法識別,並且文件名比較怪的都是別人獨立開發的格式,這些也沒什麼壓縮空間,演算法你要看那格式種了,系統常見的文件壓縮演算法都是
ZIP文件的總體格式
分文件頭信息+文件壓縮數據
中心目錄+中心目錄記錄結束符

1.分文件頭信息:
位元組數 描述
4 分文件頭信息標志(0x04034b50)
2 解壓縮所需版本
2 通用比特標志位(置比特0位=加密;置比特1位=使用壓
縮方式6,並使用8k變化目錄,否則使用4k變化目錄;置比特2位=使用壓
縮方式6,並使用3個ShannonFano樹對變化目錄輸出編碼,否則使用2個
ShannonFano樹對變化目錄輸出編碼,其它比特位未用)
2 壓縮方式(0=不壓縮,1=縮小,2=以壓縮因素1縮小,3=以
壓縮因素2縮小,4=以壓縮因素3縮小,5=以壓縮因素4縮小,6=自展)
2 文件最後修改時間
2 文件最後修改日期
4 32位校驗碼
4 壓縮文件大小
4 未壓縮文件大小
2 文件名長
2 擴展段長
? 文件名(不定長)
? 擴展段(不定長)

2.中心目錄結構
文件頭信息...中心目錄記錄結束符
文件頭:
位元組數 描述
4 中心文件頭信息標志(0x02014b50)
2 主機操作系統(高位位元組表示主機操作系統,低位字
節表示ZIP壓縮軟體版本號,其值除以10表示主版本號,其值模10表示
次版本號。0=MS-DOS,OS/2 FAT文件系統,1=Ami ga,2=VMS,3=Unix及
變種,4=VM/CMS,5=AtariST,6=OS/2 HPFS,7=Macintosh,8=Z-System,9
=C P/M,10-255未用)
2 解壓縮所需版本
2 通用比特標志
2 壓縮方式
2 文件最後修改時間(用標準的MS-DOS時間日 期格式
編碼)
2 文件最後修改日期
4 32位校驗碼(使用David Schwaderer的CRC-32演算法產
生)
4 壓縮文件大小
4 未壓縮文件大小
2 文件名長
2 擴展段長
2 文件注釋長(分別為文件名長,擴展段,注釋 段,小於
64K)
2 磁碟起始號(本文件在磁碟中的起始號)
2 內部文件屬性(最低位若置1,表示為ASC文本,否則為
二進制數據,其它位未用)
4 外部文件屬性(依賴於主機操作系統)
4 分文件頭相對位移
? 文件名(不定長)
? 擴展段(不定長,用於未來擴展,低版本為0長)
? 文件注釋(不定長)

3.中心目錄記錄結束符
位元組數 描述
4 中心目錄標記結束符(0x06054b50)
2 磁碟號(其中包括中心目錄結束記錄)
2 磁碟中心目錄起始號
2 磁碟中心目錄入口總數
2 中心目錄入口總數(ZIP文件中的文件總數)
2 整個中心目錄大小
4 關於起始磁碟號的中心目錄初始偏移
2 ZIP文件注釋長度
? ZIP文件注釋(不定長)

加密方法
PKZIP中使用的加密方法由Roger Schlafly提供。ZIP文件在解壓
縮前必須先解密。每個加密文件具有一個12位元組的加密文件頭擴展信
息,存儲於數據區的起始位置,加密前先設置一個起始值,然後被三個3
2位的密鑰加密。密鑰被使用者提供的口令初始化。12個位元組加密之
後,由PKZIP的偽隨機數產生方法,結合PKZIP中使用CRC-32演算法對密鑰
進行更新。
具體實施分為三步:

1.用口令對三個32位密鑰初始化。
K(0)=305419896,K(1)=591751049,K(2)=878082192
循環 for i=0 to length(password)-1
調用更新密鑰函數 update_keys(password(i))
結束循環(循環口令長度次)
其中更新密鑰函數為:
update_keys(char):
Key(0)=crc32(key(0),char)
Key(1)=Key(1)+(Key(0)& 000000ffH)
Key(1)=Key(1)*134775813+1
Key(2)=crc32(Key(2),Key(1)〉〉24)
end update_keys
CRC32函數中,給定一個4位元組的CRC值和一個字元,返回一個由CRC
-32演算法更新的CRC。具體為:
crc32(c,b)=crc32tab[(c^b)&0xff]^(c>>8),crc32tab[256]的值
為固定的256個4位元組數。

2.讀取並加密12位元組的加密頭,再次對密鑰進行初始化。
將12個位元組的加密頭讀入緩沖區buffer(0)至buffer(11),循環fo
r i=0 to 11
C=buffer(i)^decrypt_byte()
update_keys(C)
buffer(i)=C
結束循環(循環12次)
其中的decrypt_byte()函數為:
unsigned char decrypt_byte()
local unsigned short temp
temp=Key(2)¦2
decrypt_byte=((temp*(temp^1))>>8)&0xff
end decrypt_byte
該步結束後,緩沖區中最後的二個位元組buffer(10)和buffer(11)
將成為加密文件校驗碼的二個最高位(按低至高順序存放)。對ZIP加
密文件進行解壓縮前,PKUNZIP軟體將使用者提供的口令按上述二個步
驟進行處理,得到的結果與校驗碼的二個高位位元組進行比較,只有當提
供了正確的口令時,結果一致,才能進行後續的解壓縮過程,否則,PKZI
P報告錯誤信息,程序自動結束。

3.讀取壓縮的數據流並以加密密鑰對其進行加密。
壓縮數據流按下述過程加密:
循環 直至數據流結束
C=數據流的一個位元組
temp=C^decrypt_byte()
update_keys(temp)
輸出temp
結束循環
請參考

② windows新建文件夾的演算法,該怎麼處理

這種情況比較罕見,你之前用的系統都是GOST版的吧? 很有可能是版本不穩定造成的。 從你用wendy賬戶 創建文件自動加密後沒有顏色顯示可以看出(排除 對文件夾選項的修改造成的)

③ 求一個類似DOS下「FC」命令文件比較功能的C語言演算法

這么多參數都要實現嗎?

剛用了一下fc,感覺如果只是實現這兩個功能不難

現在開始寫,如果明天有空應該能寫得完

FC的功能有點奇怪,好像並不是簡單的字元串比較
例如
a.txt
12
13
45
b.txt
12
14
55

fc a.txt b.txt
的結果是
***** a.txt
12
13
45
*****
***** b.txt
12
14
55
*****
雖然第一行和第三行是一樣的,但是也被輸出了
---------------------------------------------
#include <stdio.h>
#include <string.h>

char diffstr[200][2][200];

typedef struct diffcount
{
int a;
int b;
int flag;
}DCOU;

typedef struct diffbine
{
long adr;
char adata;
char bdata;
}DBIN;

DBIN diffaray[1000];

DCOU textcmp(FILE *fp_a, FILE *fp_b)
{
int redd_succ_a = 0;
int redd_succ_b = 0;
DCOU cou = {0, 0, 0};
memset(diffstr, 0, sizeof(diffstr));
while(!feof(fp_a) && !feof(fp_b))
{
redd_succ_a = fscanf(fp_a, "%s", diffstr[cou.a][0]);
redd_succ_b = fscanf(fp_b, "%s", diffstr[cou.b][1]);
//fgets(diffstr[cou.a][1], 200, fp_b);
if(redd_succ_a)
{
cou.a++;
if(redd_succ_b)
cou.b++;
else
break;
}
else
{
if(redd_succ_b)
cou.b++;
break;
}

if(strcmp(diffstr[cou.a][0], diffstr[cou.a][1]))
{
//printf("%s\n%s\n", diffstr[cou.a][0], diffstr[cou.a][1]);
if(!cou.flag)
cou.flag = cou.a + 1;
}

if(cou.a >= 200 || cou.b >= 200)
{
break;
}
}

while(!feof(fp_a))
{
if(cou.a >= 200)
{
break;
}
if(fscanf(fp_a, "%s", diffstr[cou.a][0]))
cou.a++;
}

while(!feof(fp_b))
{
if(cou.b >= 200)
{
break;
}
if(fscanf(fp_b, "%s", diffstr[cou.b][1]))
cou.b++;
}
return cou;
}

void textprint(int linecount, int text)
{
for(int i = 0; i < linecount; i++)
{
printf("%s\n", diffstr[i][text]);
}
}

void bineprint(int linecount)
{
for(int i = 0; i < linecount; i++)
{
printf("%08ld: %02x %02x\n", diffaray[i].adr - 1, diffaray[i].adata, diffaray[i].bdata);
}
}
int binecmp(FILE *fp_a, FILE *fp_b, int *flag)
{

memset(diffaray, 0, sizeof(diffaray));
int i = 0;
while(!feof(fp_a) && !feof(fp_b) && i <500)
{
int aread = fread(&diffaray[i].adata, 1, 1, fp_a);
int bread = fread(&diffaray[i].bdata, 1, 1, fp_b);
if(aread && bread)
{
diffaray[i].adr = ftell(fp_a);
diffaray[i].adr = ftell(fp_b);

if(diffaray[i].adata != diffaray[i].bdata)
{
i++;
}
}
else
{
if(!aread && bread)
{
fseek(fp_b, SEEK_CUR, -1);
}
else
{
fseek(fp_a, SEEK_CUR, -1);
}
}
}
*flag = i;
if(!feof(fp_a))
{
if(i >= 500)
{
return -2;
}
else
{
return -1;
}
}

if(!feof(fp_b))
{
if(i >= 500)
{
return 2;
}
else
{
return 1;
}
}

return 0;
}
int main(int arg, char *cmd[10])
/*
argc保存傳遞參數和命令的個數。
argv[]依次保存每個參數和命令。
*/
{
int i, flag = 0;

if(arg < 3)//至少要有兩個文件做參數
{
printf("文件說明不充分\n");
return 1;
}

for(i = 1; i < arg - 2; i++)
{
if(!strcmp(cmd[i], "/b"))
{
flag = 1;
}
else
{
if(strcmp(cmd[i], "/a"))
{
printf("無效的命令行開頭\n");
}
}
}

FILE *fp_a, *fp_b;

if(flag)
{
//驗證是否存在
fp_a = fopen(cmd[arg - 2], "rb");
if(fp_a == NULL)
{
printf("無法打開文件 %s - 找不到這樣的文件\n", cmd[arg - 2]);
return 1;
}

fp_b = fopen(cmd[arg - 1], "rb");
if(fp_b == NULL)
{
printf("無法打開文件 %s - 找不到這樣的文件\n", cmd[arg - 1]);
fclose(fp_a);
return 1;
}

printf("正在比較文件 %s 和 %s\n", cmd[arg - 2], cmd[arg - 1]);
int cou = 0;
int resul = binecmp(fp_a, fp_b, &cou);

fclose(fp_a);
fclose(fp_b);

if(resul == 0)
{
printf("FC:找不到異同處\n");
return 0;
}
else
{
bineprint(cou);
if(resul < 0)
{
printf("FC: %s 比 %s 長\n", cmd[arg - 2], cmd[arg - 1]);
if(resul == -2)
printf("文件過長\n");
}
else
{
printf("FC: %s 比 %s 長\n", cmd[arg - 1], cmd[arg - 2]);
if(resul == 2)
printf("文件過長\n");
}
}

}
else
{
//驗證是否存在
fp_a = fopen(cmd[arg - 2], "r");
if(fp_a == NULL)
{
printf("無法打開文件 %s - 找不到這樣的文件\n", cmd[arg - 2]);
return 1;
}

fp_b = fopen(cmd[arg - 1], "r");
if(fp_b == NULL)
{
printf("無法打開文件 %s - 找不到這樣的文件\n", cmd[arg - 1]);
fclose(fp_a);
return 1;
}

printf("正在比較文件 %s 和 %s\n", cmd[arg - 2], cmd[arg - 1]);
DCOU cou = textcmp(fp_a, fp_b);

fclose(fp_a);
fclose(fp_b);

if(cou.a == 0 && cou.b == 0)
{
printf("FC:找不到異同處\n");
return 0;
}
printf("******** %s\n", cmd[arg - 2]);
textprint(cou.a, 0);
printf("******** \n");
printf("******** %s\n", cmd[arg - 1]);
textprint(cou.b, 1);
printf("******** \n");

if(cou.a == 200 || cou.b == 200 )
{
printf("\n文件過長\n");
return 1;
}
return 0;
}

return 0;
}

④ 文件內容比較演算法優化

如果數據量小 可以用字典樹。

數據量大的話 要用後綴樹或者後綴數組了

⑤ 急急急! 用java實現如下演算法: 給定兩個文件夾,每個文件夾都有文件名相對應的若干xml文件,每

話說你已經有XML了,為什麼還要用別的來保存結點呢?
直接迭代一個XML,然後用XPATH語法在另一個XML中找就OK了.都不用迭代兩次就OK了

⑥ java比較2個文件是否是相同的文件,是一個一個位元組比較還是計算MD5比較好啊

不同內容得出相同MD5值,雖然概率低,但總是不放心。如果在已知文件編碼范圍的條件下,找到MD5絕對區分長度范圍(即:該范圍內取樣內容的MD5相同的,內容保證相同;絕不存在不同內容得出相同MD5值的現象),那麼,可按合理的長度分片、按一定順序遍歷整個文件(屬性信息、頭部、尾部、同步隨機點、其他),比較MD5,一旦有異立即判定文件不同,終止比較。這種分片取樣比較MD5的思路可能快於逐位元組比較也絕對可信

要確保 100%正確就必須校驗全文,通過以上思路來比較,即是。
(註:

其他據說相對於MD5來講不易碰撞(即不同內容得出相同MD5值的概率可能更低)的演算法推薦:起碼 SHA1 ,最好 SHA256、 SHA512、MD5+CRC32、HMAC,或者幾種不同類型演算法的同步進行。

在精通演算法的情況下,將這里推薦的演算法取代上文中提到的MD5來考量,能擴大絕對區分長度范圍,可能更方便更快的比較。

但是又有這樣的考慮:逐位元組比較的演算法最簡單,演算法弄復雜了反而會增加額余的時間;逐位元組比較的演算法也可以放到上文中來考量,進行同步取樣和各種遍歷的順序與方式,說不定,在保證100%的可信度的條件下,逐字比較反而最快呢?
我覺得時間的耗費關鍵處在於,所有的演算法,都要將兩個位於不同區域或載體的文件的同位區域收集到一起進行比較,這個收集花費時間Ta(i),與取樣長度、存儲區域或載體等相關;{如果要將文件取很大一部或全部讀入內存,然後再逐一集中比較,則會減小以上的Ta(i),而增加一個額外讀入的時間Tc(i)*次數M(i)}。比較的次數大致為N(i);而如果在一個文件中順序讀取一個區域並且計算它的某個整體評定值,這個花費的時間為Tb(i),與取樣長度、計算程序、設備性能等相關。

總體的比較時間大致是Ta(i)*N(i)*Tb(i)+{Tc(i)*M(i)}
逐位元組比較,其中Tb(i)、Ta(i)都是最短的,但是N(i)最大,

總之,可以設計不同的演算法,通過實際環境和文件的檢測,來決定採用何種演算法。


外一則:
兩個取樣內容, MD5等演算法的計算值 不同,則內容一定不同; 計算值相同,則 內容可能相同,但可能性是否達到100%,內容相同的概率是多少,根據編碼范圍、演算法來確定。如果是比較一個文件和許多其他文件是否相同,並且提前知道其他文件的 MD5 值,可先比較 MD5 值可以大大提高文件比較的速度。

⑦ 什麼是最快的哈希演算法來檢查兩個文件是一樣的嗎

該哈希演算法為一個文件生成一個小的二進制「指紋」,從統計學的角度來看,不同的文件不可能生成相同的哈希碼
要生成一個哈希碼,必須首先創建一個HashAlgorithm對象,通過HashAlgorithm.Create方法來完成。然後調用
HashAlgorithm.ComputeHash方法,它會返回一個存儲哈希碼的位元組數組,再使用BitConverter.Tostring()將其
裝換為字元串進行比較。
源碼如下:復制代碼代碼如下:public static bool isValidFileContent(string filePath1, string filePath2){//創建一個哈希演算法對象
using (HashAlgorithm hash = HashAlgorithm.Create()){using (FileStream file1 = new FileStream(filePath1, FileMode.Open),file2=new FileStream(filePath2,FileMode.Open)){byte[] hashByte1 = hash.ComputeHash(file1);//哈希演算法根據文本得到哈希碼的位元組數組
byte[] hashByte2 = hash.ComputeHash(file2);
string str1 = BitConverter.ToString(hashByte1);//將位元組數組裝換為字元串
string str2 = BitConverter.ToString(hashByte2);
return (str1==str2);//比較哈希碼}}}使用該函數的主函數復制代碼代碼如下:static void Main(string[] args){string filePath1 = @"f:/1.txt";
string filePath2 = @"f:/2.txt";
bool valid=isValidFileContent(filePath1, filePath2);

⑧ Linux使用diff命令怎麼比較文件

Y:diff命令
●簡介
★diff命令用於比較文件的差異。
★diff以逐行的方式,比較文本文件的異同處。如果指定要比較目錄,則diff會比較目錄中相同文件名的文件,但不會比較其中子目錄。
●語法
★命令格式:diff[參數][文件1或目錄1][文件2或目錄2]
★參數:
☆-<行數> 指定要顯示多少行的文本。此參數必須與-c或-u參數一並使用。
☆-a或--text diff預設只會逐行比較文本文件。
☆-b或--ignore-space-change 不檢查空格字元的不同。
☆-B或--ignore-blank-lines 不檢查空白行。
☆-c 顯示全部內文,並標出不同之處。
☆-C<行數>或--context<行數> 與執行"-c-<行數>"指令相同。
☆-d或--minimal 使用不同的演演算法,以較小的單位來做比較。
☆-D<巨集名稱>或ifdef<巨集名稱> 此參數的輸出格式可用於前置處理器巨集。
☆-e或--ed 此參數的輸出格式可用於ed的script文件。
☆-f或-forward-ed 輸出的格式類似ed的script文件,但按照原來文件的順序來顯示不同處。
☆-H或--speed-large-files 比較大文件時,可加快速度。
☆-l<字元或字元串>或--ignore-matching-lines<字元或字元串> 若兩個文件在某幾行有所不同,而這幾行同時都包含了選項中指定的字元或字元串,則不顯示這兩個文件的差異。
☆-i或--ignore-case 不檢查大小寫的不同。
☆-l或--paginate 將結果交由pr程序來分頁。
☆-n或--rcs 將比較結果以RCS的格式來顯示。
☆-N或--new-file 在比較目錄時,若文件A僅出現在某個目錄中,預設會顯示:
☆Only in目錄:文件A若使用-N參數,則diff會將文件A與一個空白的文件比較。
☆-p 若比較的文件為C語言的程序碼文件時,顯示差異所在的函數名稱。
☆-P或--unidirectional-new-file 與-N類似,但只有當第二個目錄包含了一個第一個目錄所沒有的文件時,才會將這個文件與空白的文件做比較。
☆-q或--brief 僅顯示有無差異,不顯示詳細的信息。
☆-r或--recursive 比較子目錄中的文件。
☆-s或--report-identical-files 若沒有發現任何差異,仍然顯示信息。
☆-S<文件>或--starting-file<文件> 在比較目錄時,從指定的文件開始比較。
☆-t或--expand-tabs 在輸出時,將tab字元展開。
☆-T或--initial-tab 在每行前面加上tab字元以便對齊。
☆-u,-U<列數>或--unified=<列數> 以合並的方式來顯示文件內容的不同。
☆-v或--version 顯示版本信息。
☆-w或--ignore-all-space 忽略全部的空格字元。
☆-W<寬度>或--width<寬度> 在使用-y參數時,指定欄寬。
☆-x<文件名或目錄>或--exclude<文件名或目錄> 不比較選項中所指定的文件或目錄。
☆-X<文件>或--exclude-from<文件> 您可以將文件或目錄類型存成文本文件,然後在=<文件>中指定此文本文件。
☆-y或--side-by-side 以並列的方式顯示文件的異同之處。
☆--help 顯示幫助。
☆--left-column 在使用-y參數時,若兩個文件某一行內容相同,則僅在左側的欄位顯示該行內容。
☆--suppress-common-lines 在使用-y參數時,僅顯示不同之處。
●案例
★實例一:比較兩個文件
[root@localhost test3]# diff log2014.log log2013.log
3c3
< 2014-03
---
> 2013-03
8c8
< 2013-07
---
> 2013-08
11,12d10
< 2013-11
< 2013-12
☆上面的"3c3"和"8c8"表示log2014.log和log20143log文件在3行和第8行內容有所不同;"11,12d10"表示第一個文件比第二個文件多了第11和12行。
★實例二:並排格式輸出
[root@localhost test3]# diff log2014.log log2013.log -y -W 50
2013-01 2013-01
2013-02 2013-02
2014-03 | 2013-03
2013-04 2013-04
2013-05 2013-05
2013-06 2013-06
2013-07 2013-07
2013-07 | 2013-08
2013-09 2013-09
2013-10 2013-10
2013-11 <
2013-12 <
[root@localhost test3]# diff log2013.log log2014.log -y -W 50
2013-01 2013-01
2013-02 2013-02
2013-03 | 2014-03
2013-04 2013-04
2013-05 2013-05
2013-06 2013-06
2013-07 2013-07
2013-08 | 2013-07
2013-09 2013-09
2013-10 2013-10
> 2013-11
> 2013-12
★說明:
☆"|"表示前後2個文件內容有不同;
☆"<"表示後面文件比前面文件少了1行內容;
☆">"表示後面文件比前面文件多了1行內容;

⑨ C# 編寫文件備份工具,請教 備份文件有必要用哈希演算法比較文件嗎還請教比較兩個目錄文件的思路謝謝

看你願意等的時間了,一般來說是有的,哈希保證文件被修改,其他方式都不是100%保證。但是達到幾g要等十幾秒了,如果不願意等只能比較部分,取文件修改時間,大小之類的手段了。
比較目錄還要啥思路,取本地文件列表,已備份名單是否存在該文件,不存在或哈希不對就備份,

閱讀全文

與文件夾比較演算法相關的資料

熱點內容
服輸電影 瀏覽:813
女程序員手腕磨印子 瀏覽:864
5周歲看電影可以嗎 瀏覽:901
男女親熱把房子弄倒的韓國電影 瀏覽:979
什麼APP看台灣節目 瀏覽:350
csgo如何看伺服器 瀏覽:894
有一部美國電影叫什麼花? 瀏覽:138
命令行安裝dmg 瀏覽:646
阿加莎無人生還電影免費觀看 瀏覽:256
能看的那種網你知道幾個 瀏覽:115
關閉命令在 瀏覽:660
吃魚子全死了的電影 瀏覽:551
柬愛女老闆開美容院的女主叫什麼 瀏覽:337
在線觀看地址有推薦嗎 瀏覽:709
鐵嶺新瑪特大地影院節目表 瀏覽:181
gui編程前途 瀏覽:641
山東學英語app軟體定製哪裡好 瀏覽:477
民國和現代來回穿越小說 瀏覽:692
phpwebservice搭建 瀏覽:253
安卓機器為什麼會卡頓 瀏覽:881