导航:首页 > 源码编译 > 文件夹比较算法

文件夹比较算法

发布时间: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要等十几秒了,如果不愿意等只能比较部分,取文件修改时间,大小之类的手段了。
比较目录还要啥思路,取本地文件列表,已备份名单是否存在该文件,不存在或哈希不对就备份,

阅读全文

与文件夹比较算法相关的资料

热点内容
鞋的程序员 浏览:259
车的压缩比是什么意思 浏览:200
网站源码怎么传到文件夹 浏览:912
海南压缩机在哪里 浏览:491
电脑文件夹清晰的文件结构 浏览:839
如何把苹果手机的app转到安卓 浏览:305
java同步并发 浏览:249
fw压缩图片 浏览:258
淘宝申请源码靠谱吗 浏览:874
androidupdater 浏览:635
c2d游戏源码大全可复制版 浏览:771
电脑怎样重置网关命令 浏览:411
winftplinux 浏览:335
推特app界面如何设置成中文 浏览:452
太空工程师转子编程属性 浏览:32
windowscmd关机命令 浏览:342
云桌面只要服务器装一套软件 浏览:247
电脑右键按到什么导致文件夹全屏 浏览:454
我的世界如何制造服务器主城 浏览:365
linuxssh连不上 浏览:297