boyhong 发表于 2012-3-31 07:25:49

如何比较两个文件夹是否内容相同?

本帖最后由 boyhong 于 2012-3-31 08:39 编辑

如何比较两个文件夹是否内容相同?

有两个文件夹,如何快速比较这两个文件夹内文件及子文件夹内容能完全一样?

求实现想法?谢啦。

本想用如下比较,但感觉还是不够精确,数目相同并不代表两个文件就一定一样。。。。。
DirGetSize ( "路径" [, 标志] )
$array = 空间大小
$array = 文件数
$array = 文件夹数

看到一个用md5来比较文件的,但有一个DLLL要fileinstall,只好放弃了,不知有没有纯AU3的。。。。,。。。。另:要考虑文件夹还有子文件夹,兼容64位系统谢谢。

user3000 发表于 2012-3-31 08:23:57

文件夹也能用 MD5 来比较啊?
希望这问题早点能解决, 给我拓展下知识!

boyhong 发表于 2012-3-31 08:40:54

文件夹也能用 MD5 来比较啊?
希望这问题早点能解决, 给我拓展下知识!
user3000 发表于 2012-3-31 08:23 http://www.autoitx.com/images/common/back.gif


    不好意思,少打两个字,文件。目前我仍然没有找着一个满意的方法。。。不知大家会如何处理此问题?

user3000 发表于 2012-3-31 09:01:36

不好意思,少打两个字,文件。目前我仍然没有找着一个满意的方法。。。不知大家会如何处理此问题 ...
boyhong 发表于 2012-3-31 08:40 http://www.autoitx.com/images/common/back.gif

我经常用的 BC对比, 它有许多种对比模式.
包括 MD5.
话说回来, au3读取文件的 MD5 值是很方便的. 为什么要用 DLL ?

boyhong 发表于 2012-3-31 10:01:44

我经常用的 BC对比, 它有许多种对比模式.
包括 MD5.
话说回来, au3读取文件的 MD5 值是很方便的. 为什 ...
user3000 发表于 2012-3-31 09:01 http://www.autoitx.com/images/common/back.gif


   “ au3读取文件的 MD5 值”在64位WIN7下失败。。。。
另,文件夹比对,你的用的是BC对比?不明白,抱歉。请指教,谢谢。

user3000 发表于 2012-3-31 10:24:25

“ au3读取文件的 MD5 值”在64位WIN7下失败。。。。
另,文件夹比对,你的用的是BC对比?不明 ...
boyhong 发表于 2012-3-31 10:01 http://www.autoitx.com/images/common/back.gif

Beyong Compare 工具.名气应该不小吧.
FastCopy 也有一定对比功能, 没前者好, 却胜任大容量拷贝工作.

502762378 发表于 2012-3-31 12:27:38

提供个不严谨的方法:
可以对比两个文件的大小,没有这么凑巧的事情吧
也可以再加判断

502762378 发表于 2012-3-31 12:28:42

算我没说。。。。

netegg 发表于 2012-3-31 20:15:58

回复 8# 502762378
为什么没有

502762378 发表于 2012-3-31 21:25:47

回复 10# netegg


    我没细看楼主内容,楼主已经觉得判断文件大小不精确了

netegg 发表于 2012-3-31 21:33:53

_WinAPI_FindFirstChangeNotification相关还有两个函数,看看也许有启发

xms77 发表于 2012-3-31 21:35:57

回复 10# netegg
蛋哥,应该是小概率事件了吧?

whitehead 发表于 2012-3-31 22:17:18

希望高手提供实例

魔导 发表于 2012-4-1 10:24:29

这个小弟真不懂,不过小第在用一个文件夹同步软件
他是 对比 ===>文件名, 大小,修改时间,属性。然后不不同的列出来看想要而定

zcx880517 发表于 2012-4-1 10:51:25

本帖最后由 zcx880517 于 2012-4-1 22:04 编辑


#include <GuiConstantsEx.au3>
#include <WindowsConstants.au3>
$FORM = GUICREATE( "文件对比工具" , 230 , 130 )
GUICTRLCREATELABEL( "目录1:" , 15 , 15 , 45 , 18 )
$INPUT1 = GUICTRLCREATEINPUT( "" , 60 , 15 , 125 , 18 )
$BUTTON1 = GUICTRLCREATEBUTTON( "浏览" , 185 , 15 , 30 , 18 )
GUICTRLCREATELABEL( "目录2:" , 15 , 45 , 45 , 18 )
$INPUT2 = GUICTRLCREATEINPUT( "" , 60 , 45 , 125 , 18 )
$BUTTON2 = GUICTRLCREATEBUTTON( "浏览" , 185 , 45 , 30 , 18 )
GUICTRLCREATELABEL( "紧比对:" , 15 , 75 , 50 , 18 )
$RADIO1 = GUICTRLCREATERADIO( "全部" , 65 , 75 , 45 , 18 )
GUICTRLSETSTATE( $RADIO1 , $GUI_CHECKED )
$RADIO2 = GUICTRLCREATERADIO( "目录" , 118 , 75 , 45 , 18 )
$RADIO3 = GUICTRLCREATERADIO( "文件" , 170 , 75 , 45 , 18 )
$CHECKBOX = GUICTRLCREATECHECKBOX( "应用到所有子目录" , 25 , 105 , 130 , 18 )
$OK = GUICTRLCREATEBUTTON( "OK" , 155 , 105 , 50 , 18 )
GUISETSTATE( @SW_SHOW )
WHILE 1
SWITCH GUIGETMSG( )
CASE $BUTTON1
$PATH1 = FILESELECTFOLDER( "选择目录(1)" , "" , 2 )
IF @ERROR <> 1 THEN GUICTRLSETDATA( $INPUT1 , $PATH1 )
CASE $BUTTON2
$PATH2 = FILESELECTFOLDER( "选择目录(2)" , "" , 2 )
IF @ERROR <> 1 THEN GUICTRLSETDATA( $INPUT2 , $PATH2 )
CASE $OK
IF GUICTRLREAD( $INPUT1 ) <> "" AND GUICTRLREAD( $INPUT2 ) <> "" THEN
WINSETSTATE( $FORM , "" , @SW_HIDE )
TOOLTIP( @CR & "程序正在比对文件" & @CR , @DESKTOPWIDTH - 260 , @DESKTOPHEIGHT - 120 )
LOCAL $REPORT = FILEOPEN( "Report.txt" , 2 )
_CMP ( GUICTRLREAD( $INPUT1 ) , GUICTRLREAD( $INPUT2 ) )
_CMP ( GUICTRLREAD( $INPUT2 ) , GUICTRLREAD( $INPUT1 ) )
FILECLOSE( $REPORT )
MSGBOX( 0 , "ok" , "全部文件已比对完成。")
RUN( "Notepad Report.txt" )
EXIT
ELSE
MSGBOX( 0 + 48 , "提示" , "比对目录不能为空!" )
ENDIF
CASE $GUI_EVENT_CLOSE
EXIT
ENDSWITCH
WEND
FUNC _CMP ( $DIR1 = "" , $DIR2 = "" )
IF STRINGRIGHT( $DIR1 , 1 ) <> "\" THEN $DIR1 &= "\"
IF STRINGRIGHT( $DIR2 , 1 ) <> "\" THEN $DIR2 &= "\"
LOCAL $FOLEXISTNUM = 0 , $FILEXISTNUM = 0 , $FOLEXISTNAME = "" , $FILEXISTNAME = ""
LOCAL $FOLNOTEXISTNUM = 0 , $FILNOTEXISTNUM = 0 , $FOLNOTEXISTNAME = "" , $FILNOTEXISTNAME = ""
LOCAL $SEARCH , $FILE
$SEARCH = FILEFINDFIRSTFILE( $DIR1 & "*.*" )
WHILE 1
$FILE = FILEFINDNEXTFILE( $SEARCH )
IF @ERROR THEN EXITLOOP
IF GUICTRLREAD( $CHECKBOX ) = $GUI_CHECKED THEN
IF STRINGINSTR( FILEGETATTRIB( $DIR1 & $FILE ) , "D" ) THEN _CMP ( $DIR1 & $FILE , $DIR2 & $FILE )
ENDIF
IF FILEEXISTS( $DIR2 & $FILE ) THEN
IF STRINGINSTR( FILEGETATTRIB( $DIR2 & $FILE ) , "D" ) THEN
IF GUICTRLREAD( $RADIO1 ) = $GUI_CHECKED OR GUICTRLREAD( $RADIO2 ) = $GUI_CHECKED THEN
$FOLEXISTNUM += 1
$FOLEXISTNAME &= $FILE & @CRLF
ENDIF
ELSE
IF GUICTRLREAD( $RADIO1 ) = $GUI_CHECKED OR GUICTRLREAD( $RADIO3 ) = $GUI_CHECKED THEN
$FILEXISTNUM += 1
$FILEXISTNAME &= $FILE & @CRLF
ENDIF
ENDIF
ELSE
IF STRINGINSTR( FILEGETATTRIB( $DIR1 & $FILE ) , "D" ) THEN
IF GUICTRLREAD( $RADIO1 ) = $GUI_CHECKED OR GUICTRLREAD( $RADIO2 ) = $GUI_CHECKED THEN
$FOLNOTEXISTNUM += 1
$FOLNOTEXISTNAME &= $FILE & @CRLF
ENDIF
ELSE
IF GUICTRLREAD( $RADIO1 ) = $GUI_CHECKED OR GUICTRLREAD( $RADIO3 ) = $GUI_CHECKED THEN
$FILNOTEXISTNUM += 1
$FILNOTEXISTNAME &= $FILE & @CRLF
ENDIF
ENDIF
ENDIF
WEND
FILECLOSE( $SEARCH )
FILEWRITELINE( $REPORT , @CRLF & $DIR1 & @CRLF & @CRLF )
IF GUICTRLREAD( $RADIO1 ) = $GUI_CHECKED OR GUICTRLREAD( $RADIO2 ) = $GUI_CHECKED THEN
FILEWRITELINE( $REPORT , "相同目录数: " & $FOLEXISTNUM & " 多出目录数: " & $FOLNOTEXISTNUM )
ENDIF
IF GUICTRLREAD( $RADIO1 ) = $GUI_CHECKED OR GUICTRLREAD( $RADIO3 ) = $GUI_CHECKED THEN
FILEWRITELINE( $REPORT , "相同文件数: " & $FILEXISTNUM & " 多出文件数: " & $FILNOTEXISTNUM )
ENDIF
FILEWRITELINE( $REPORT , @CRLF )
IF GUICTRLREAD( $RADIO1 ) = $GUI_CHECKED OR GUICTRLREAD( $RADIO2 ) = $GUI_CHECKED THEN
IF $FOLEXISTNUM > 0 THEN FILEWRITELINE( $REPORT , "相同目录列表:" & @CRLF & $FOLEXISTNAME & @CRLF )
IF $FOLNOTEXISTNUM > 0 THEN FILEWRITELINE( $REPORT , "多出目录列表:" & @CRLF & $FOLNOTEXISTNAME & @CRLF )
ENDIF
IF GUICTRLREAD( $RADIO1 ) = $GUI_CHECKED OR GUICTRLREAD( $RADIO3 ) = $GUI_CHECKED THEN
IF $FILEXISTNUM > 0 THEN FILEWRITELINE( $REPORT , "相同文件列表:" & @CRLF & $FILEXISTNAME & @CRLF )
IF $FILNOTEXISTNUM > 0 THEN FILEWRITELINE( $REPORT , "多出文件列表:" & @CRLF & $FILNOTEXISTNAME & @CRLF )
ENDIF
ENDFUNC
页: [1] 2
查看完整版本: 如何比较两个文件夹是否内容相同?