[UMU WSH 教程](44) WII 应用实例 - 查找重复文件

2013-05-28  来源:本站原创  分类:WSH  人气:2 

[UMU WSH 教程](43) WIA 应用实例 - 批量转换图片格式

[UMU WSH 教程](42) FSO 应用实例 - 批量删除文件

UMU WSH 教程代码下载:http://sdrv.ms/ZpPPaS

UMU WSH Git:http://git.quweiji.com/umu618/umu-wsh

  数据经常 in-in-out-out 难免产生重复,比如上次 UMU 在 Surface RT 上导入 iPhone4S 和 iPhone5 的照片时发生的悲剧:

把 iPhone 4S 的照片导到 #Surface#,然后刷机去越狱,后来又把 iPhone 5 的照片也导进来,没料到两个 iPhone 的文件夹是一样的名字,于是文件混到了一起,尼玛!里面有不少内容不一样文件名一样的照片,所以选择不覆盖,重新复制 5 的照片到另一个文件夹,但 4S 的文件夹里已经混入了好多 5 的照片!还好 #Surface# 支持 VBScript,哥的去重复文件脚本可以发挥作用了!生产力第一名的平板——其实就是给没有生产力的 iOS 设备打工的,哈!悲剧~

  本篇要介绍的是使用 Surface RT 支持的 WSH 脚本实现查找重复文件这个任务,其中使用到的三个主要对象:FSO、SD 大家应该知道,WII 是 WindowsInstaller.Installer,参考:《[UMU WSH 教程](40) 利用 WindowsInstaller.Installer 对象计算文件 MD5 hash 值》一文,http://hi.baidu.com/umu618/item/0769e3cecd216e3298b4980a

  先把思路介绍清楚,以便读者使用其它语言实现:1、计算 Hash 的代价是比较高的,而文件大小是很容易获取的,所以应该先利用文件大小来比较文件,只有大小重复的需要计算 Hash;2、空文件都是重复的,不用 Hash 了……3、由于要做成通用程序,所以只做了查找,您可以根据代码,自行添加删除带某些特征的重复文件。代码如下:

' 44_FindDuplicates.VBS
' UMU @ 10:23 2013/05/26
' [UMU WSH 教程](44) 查找重复文件
Option Explicit

Const APP_TITLE = "UMU.Script.Tools.FindDuplicates"

Dim fso
Dim wi
Dim file_name_dictionary, file_size_dictionary, file_size_and_hash_dictionary
Dim file_index
Dim group

Call Main()

Private Sub Main()
    Set fso = CreateObject("Scripting.FileSystemObject")
    Dim args
    Set args = WScript.Arguments
    If args.Count = 0 Then
        Dim wsh
        Dim send_to, copy_to

        MsgBox "本程序用来查找重复文件(根据文件内容,非文件名)。" & vbCrLf & _
            "请把要处理的文件或文件夹拖放到本程序的图标上!", _
            vbInformation, APP_TITLE

        Set wsh = CreateObject( "WScript.Shell" )
        send_to = wsh.SpecialFolders("SendTo")
        copy_to = send_to & "\FindDuplicates.VBE"

        If Not fso.FileExists(copy_to) Then
            If vbOK = MsgBox("本程序用来查找重复文件。" & vbCrLf & _
                "请把要处理的文件或文件夹拖放到本程序的图标上!" & vbCrLf & vbCrLf & _
                "提示:您可以把此文件放在 Sendto 目录里,然后使用右键菜单的“发送到”。" & vbCrLf & _
                "您的 Sendto 目录是 " & send_to & vbCrLf & "按“确定”执行复制操作。", _
                vbOKCancel + vbInformation, APP_TITLE) Then

                fso.CopyFile WScript.ScriptFullName, copy_to

                If vbYes = MsgBox("是否查看 Sendto 目录?", vbQuestion + vbYesNo, APP_TITLE) Then
                    wsh.Run "%SystemRoot%\explorer.exe /n, /select," & copy_to
                End If
            End If
        End If

        Set wsh = Nothing
        Set args = Nothing
        Set fso = Nothing
        Exit Sub
    End If

    Set file_name_dictionary = CreateObject("Scripting.Dictionary")
    Set file_size_dictionary = CreateObject("Scripting.Dictionary")
    file_index = 0

    Dim ar
    For Each ar In args
        If fso.FolderExists(ar) Then
            Call AddFolder(ar)
        ElseIf fso.FileExists(ar) Then
            Call AddFile(ar)
        End If
    Next
    Set ar = Nothing
    Set args = Nothing

    If file_name_dictionary.Count = file_size_dictionary.Count Then
        MsgBox "文件总数:" & file_name_dictionary.Count & vbCrLf & _
            "没有重复的文件", vbInformation, "整个世界清静了!"
    ElseIf MsgBox("文件总数:" & file_name_dictionary.Count & vbCrLf & _
        "文件大小不重复数:" & file_size_dictionary.Count, vbInformation + vbOkCancel, "按确定继续") = vbOK Then
        Call FindDuplicates()
    End If
    Set fso = Nothing
    Set file_name_dictionary = Nothing
    Set file_size_dictionary = Nothing

    MsgBox "重复组数:" & group, vbInformation, "整个世界清静了!"
End Sub

Private Sub AddFolder(ByVal folder_path)
    'On Error Resume Next

    Dim rfd, fs, f, fds, fd

    Set rfd = fso.GetFolder(folder_path)
    Set fs = rfd.Files
    For Each f In fs
        Call AddFileWithSize(f.Path, f.Size)
    Next

    Set fds = rfd.SubFolders
    For Each fd In fds
        Call AddFolder(fd.Path)
    Next
End Sub

Private Sub AddFile(file_path)
    'On Error Resume Next
    Dim file

    Set file = fso.GetFile(file_path)
    Call AddFileWithSize(file.Path, file.Size)
    Set file = Nothing
End Sub

Private Sub AddFileWithSize(file_path, file_size)
    'On Error Resume Next
    file_name_dictionary.Add file_index, file_path
    If file_size_dictionary.Exists(file_size) Then
        file_size_dictionary.Item(file_size) = file_size_dictionary.Item(file_size) & ";" & file_index
    Else
        file_size_dictionary.Add file_size, file_index
    End If
    file_index = file_index + 1
End Sub

Private Function BigEndianHex(int)
    Dim result
    Dim b1, b2, b3, b4

    result = Right("0000000" & Hex(int), 8)
    b1 = Mid(result, 7, 2)
    b2 = Mid(result, 5, 2)
    b3 = Mid(result, 3, 2)
    b4 = Mid(result, 1, 2)

    BigEndianHex = b1 & b2 & b3 & b4
End Function

Private Function GetFileHash(file_name)
    Dim file_hash
    Dim hash_value
    Dim i

    Set file_hash = wi.FileHash(file_name, 0)
    hash_value = ""
    For i = 1 To file_hash.FieldCount
        hash_value = hash_value & BigEndianHex(file_hash.IntegerData(i))
    Next
    Set file_hash = Nothing
    GetFileHash = hash_value
End Function

Private Sub FindDuplicates()
    Set wi = CreateObject("WindowsInstaller.Installer")
    Set file_size_and_hash_dictionary = CreateObject("Scripting.Dictionary")

    Dim file_size_array
    Dim file_name_index_array
    Dim ubound_of_file_size_dictionary

    ' UMU: dictionary -> 2 arraies, for quick finding
    file_size_array = file_size_dictionary.Keys
    file_name_index_array = file_size_dictionary.Items
    ubound_of_file_size_dictionary = file_size_dictionary.Count - 1
    file_size_dictionary.RemoveAll

    Dim i
    For i = 0 To ubound_of_file_size_dictionary
        If InStr(file_name_index_array(i), ";") <> 0 Then
            If file_size_array(i) = 0 Then
                ' UMU: empty files are all the same
                file_size_and_hash_dictionary.Add 0, file_name_index_array(i)
            Else
                Dim file_index_array
                Dim index

                file_index_array = Split(file_name_index_array(i), ";")
                For Each index In file_index_array
                    Dim hash
                    Dim key
                    ' UMU: CLng() is important
                    hash = GetFileHash(file_name_dictionary.Item(CLng(index)))
                    key = file_size_array(i) & ":" & hash
                    If file_size_and_hash_dictionary.Exists(key) Then
                        ' UMU: we've got it!
                        file_size_and_hash_dictionary.Item(key) = file_size_and_hash_dictionary.Item(key) & ";" & index
                    Else
                        file_size_and_hash_dictionary.Add key, index
                    End If
                Next
            End If
        End If
    Next
    Erase file_size_array
    Erase file_name_index_array

    ' UMU: dictionary -> 2 arraies, for quick finding
    Dim file_and_hash_array
    Dim ubound_of_file_size_and_hash_dictionary
    file_and_hash_array = file_size_and_hash_dictionary.Keys
    file_name_index_array = file_size_and_hash_dictionary.Items
    ubound_of_file_size_and_hash_dictionary = file_size_and_hash_dictionary.Count - 1
    file_size_and_hash_dictionary.RemoveAll

    Dim file
    Dim cd

    cd = WScript.ScriptFullName
    cd = Left(cd, InStrRev(cd, "\"))
    Set file = fso.CreateTextFile(cd & "Duplicates.txt")
    group = 0
    For i = 0 To ubound_of_file_size_and_hash_dictionary
        If InStr(file_name_index_array(i), ";") <> 0 Then
            group = group + 1
            file.WriteLine "// Group " & group & ", " & file_and_hash_array(i)
            file_index_array = Split(file_name_index_array(i), ";")
            For Each index In file_index_array
                file.WriteLine file_name_dictionary.Item(CLng(index))
            Next
            file.WriteLine ""
        End If
    Next
    file.Close
    Set file = Nothing
    Erase file_and_hash_array
    Erase file_name_index_array

    Set wi = Nothing
    Set file_size_and_hash_dictionary = Nothing
End Sub
相关文章
  • [UMU WSH 教程](44) WII 应用实例 - 查找重复文件 2013-05-28

    [UMU WSH 教程](43) WIA 应用实例 - 批量转换图片格式 [UMU WSH 教程](42) FSO 应用实例 - 批量删除文件 UMU WSH 教程代码下载:http://sdrv.ms/ZpPPaS UMU WSH Git:http://git.codeweblog.com/umu618/umu-wsh 数据经常 in-in-out-out 难免产生重复,比如上次 UMU 在 Surface RT 上导入 iPhone4S 和 iPhone5 的照片时发生的悲剧: 把 iPho

  • [UMU WSH 教程](43) WIA 应用实例 - 批量转换图片格式 2012-10-14

    [UMU WSH 教程](42) FSO 应用实例 - 批量删除文件 UMU WSH 教程代码下载:http://sdrv.ms/ZpPPaS UMU WSH Git:http://git.codeweblog.com/umu618/umu-wsh bmp 格式的图片占空间比较大,转为无损压缩的 png 格式可以节省空间.下面利用 FSO 和 WIA 对象批量转换 bmp 文件为 png 格式. ' 43_bmp2png.VBS ' UMU @ 0:23 2012/10/14 ' [UMU WS

  • fdupe 查找重复文件的Perl脚本代码 2014-11-14

    fdupe 是一个很小的 Perl 脚本,用来检索指定目录并找出其中重复的文件,该脚本是通过文件内容来识别是否重复文件,而非文件名.fdupe 无需其他 Perl 脚本支持,运行速度非常快 图: #!/usr/bin/perl # # fdupe tool - finding duplicate files # # $Id: fdupe,v 1.7 2011/10/14 20:11:21 root Exp root $ # # Source code Copyright (c) 1998,201

  • python实现在目录中查找指定文件的方法 2014-01-25

    这篇文章主要介绍了python实现在目录中查找指定文件的方法,通过模糊查找与精确查找两个实例较为详细的阐述了文件查找的方法,是非常实用的技巧,需要的朋友可以参考下 本文实例讲述了python实现在目录中查找指定文件的方法.分享给大家供大家参考.具体实现方法如下: 1. 模糊查找 import os from glob import glob #用到了这个模块 def search_file(pattern, search_path=os.environ['PATH'], pathsep=os.p

  • Linux查找包含指定文字的文件(linux查找指定文件) 2014-10-01

    本文介绍Linux查找包含指定文字的文件命令(linux查找指定文件),大家参考使用吧 在Linux下,查找包含字符串的文件使用的命令是grep.如果要查找包含**的文件,使用grep ** file是不行的,因为grep认为**是正则表达式,结果不可预料.正确的做法是: grep '\*\*' file 比如: [[email protected] www.vktone.com]# grep '\*\*' *.html */*.html >filtered.txt [[email protected] www.vktone.co

  • 盛大光速搜索,查找电脑文件神快 2015-03-30

    盛大光速搜索,光看这名字,就知道这软件是干什么的,而且突显了速度何等之快! 盛大光速搜索,是盛大创新院发布的一款可以完全替代Windows搜索的桌面快速搜索工具,是目前搜索和管理个人电脑文件最快的软件产品. 光速搜索的功能特点: - 高效:输入关键字,精准显示搜索结果,最快找到你想要的 - 轻巧:小于3MB的安装包,几乎不消耗系统资源,占用磁盘空间微乎其微 - 便捷:本机文档.图片.程序.视频等智能分类,查找更轻松 - 易用:贴合用户习惯的设计,界面清爽,功能明确,指引清晰 随着个人电脑的硬盘空

  • ASP.NET Web API教程 创建Admin控制器实例分享 2014-06-26

    在本文中我们要添加一个对产品支持CRUD(创建.读取.更新和删除)操作的Web API控制器,需要的朋友可以参考下 In this section, we'll add a Web API controller that supports CRUD (create, read, update, and delete) operations on products. The controller will use Entity Framework to communicate with the d

  • php中的curl使用入门教程和常见用法实例 2014-12-29

    起先cURL是做为一种命令行工具设计出来的,比较幸运的是,php也支持cURL了.通过cURL这个利器,我们能在php程序中自由地发送HTTP请求到某个url来获取或者提交数据,并且支持其它多种协议,比如FTP,Telnet以及SMTP等.在这篇博文中,我将简述下,在php中具体怎么使用cURL来处理一些事情. 一.curl的优势 你也许会说,在php中可以很容易的获取某个url的内容,只要通过file_get_contents,file或者readfile函数就能轻松实现,根本不必使用cURL

  • [CSS3]实例教程3:CSS3动画实例教程(集合贴) 2012-08-16

    前端各种奇淫巧计层出不穷,对缺乏创造力和建设性的本人来说,一般都是到需要的时候才会去研究,没办法,信息量暴增的年代,总得有选择性地记忆吧.因为各种特殊原因,不得不用css3写个loading加载的动画效果.在渐变效果上,gif显然层次不够丰富.我对图片处理不在行,不过AE要求很高,于是到网上一搜有解决办法,就不辛苦设计部同事了. 关于CSS3动画效果,废话两句.或者是我程序写的有问题(我对自己写的东西一直很没自信,我从来不敢对别人说我是敲代码的,我只说我是写页面的),我写的CSS3整屏滑动的效果

  • nodejs教程 安装express及配置app.js文件的详细步骤 2013-12-08

    express.js是nodejs的一个MVC开发框架,并且支持jade等多种模板.下面简单来说说express的安装和app.js文件的配置,然后在今后的教程中一步一步使用express.js搭建个聊天室 安装express.js 如果你安装了npm,安装变得很简单,只需要在终端中运行下面的代码即可: npm install express -gd -g代表安装到NODE_PATH的lib里面,而-d代表把相依性套件也一起安装.如果?]有-g的话会安装目前所在的目录(会建立一个node_mod

  • C++利用容器查找重复列功能实现 2015-02-04

    本文将详细介绍c++容器简介,c++容器的比较 与操作实例,需要了解更多的朋友可以参考下 # include <vector> # include <iostream> # include <set> using namespace std; int main(int argc, char * argv[]) { vector<int> v; //找一些数据来测试 for (int i = 0; i < 50; i++) v.push_back(ran

  • mysql 数据表中查找重复记录 2013-12-16

    以下sql语句可以实现查找出一个表中的所有重复的记录 select user_name,count(*) as count from user_table group by user_name having count>1; 这个我在很早有发过一个asp下的ACCESS 的

  • java文件操作代码片断实例实现统计文件中字母出现的个数功能 2014-11-07

    本文介绍java读文件实例,实现统计某一目录下每个文件中出现的字母个数.数字个数.空格个数及行数,除此之外没有其他字符,大家参考使用吧 String fileName = "D:/date.java.bak"; // String fileName = "D:/test.qqq"; String line; int i = 0, j = 0, f = 0, k = 0; try { BufferedReader in = new BufferedReader(new

  • ASMSupport教程2:如何查看生成的class文件和查看log文件内容 2013-03-25

    在http://my.codeweblog.com/wensiqun/blog/116067中我们主要介绍了如何生成一个Helloworld的Class. 在上篇blog的基础上我们来看下接下来两个问题: 如何查看生成Class文件 如何查看log文件内容 1.查看生成的Class文件 我们是通过ClassCreator来创建Class的.而他是继承自jw.asmsupport.creator.IClassContext的.我们通过调用IClassContext的setClassOutPutPa

  • Win32查找指定文件 2014-06-03

    函数名称 _findfirst 头文件 io.h 函数功能 搜索与指定的文件名匹配的第一个实例,成功返回实例句柄,否则返回-1L 函数原型 long _findfirst( char *filespec, struct _finddata_t *fileinfo ); 函数名称 _findnext 头文件 io.h 函数功能 搜索_findfirst函数匹配的下个实例,成功则返回0,否则返回-1 函数原型 int _findnext( intptr_t handle, struct _findd

  • Linux批量查找替换文件内容 2014-06-24

    批量查找文件内容 find ./ -name "*.php" | xargs grep '关键字' 批量替换文件内容 find -name '要查找的文件名' | xargs perl -pi -e 's|被替换的字符串|替换后的字符串|g'

  • Linux查找一个文件夹内所有包含某字符串的文件 2014-01-20

    查/home目录下后缀名为sql而且内容包含"abc"的文件 find /home -type f -name "*.sql" | xargs grep -i "abc" -i表示不区分大小写

  • 当前位置:绿茶软件园 文章教程 操作系统 win7系统搜索不到文件的解决方法 win7 2014-03-11

    方法一:使用第三方搜索软件 这类软件有很多,介绍其中一款EveryThing,这个软件采用的是类似Win7的索引的方式,运行后会默认扫描一次硬盘,然后搜索就秒出了 方法二.启用Win索引功能Win7的索引功能,你可以理解为把文件加入到一个库内,比如说,没有索引之前,如果你要搜索一个文件,会从整个硬盘或 者你设置的相应目录搜索所有文件,如果索引后,就直接同库内调取,基本上秒出结果,而且还有个好处,你哪怕只搜索一个关键字,也不会遇到那个人所说的 BUG问题 一.打开Win7索引: 索引功能默认是打开

  • VBS访问剪贴板的几种方法小结 2014-04-28

    最常见的是InternetExplorer.Application对象,网上一搜一大把. Set IE = CreateObject("InternetExplorer.Application") IE.Navigate("about:blank") Set clipboard = IE.document.parentWindow.clipboardData 'SetData设置剪切板的内容 clipboard.SetData "text", &

  • 给 Linux 系统"减肥" 2015-03-29

    前言 Linux 计算机安装后,在我们不断的使用过程中,因为添加.删除软件和上网冲浪.调试程序等行为,硬盘中会产生各种各样的垃圾文件,而随着这些垃圾文件的不断膨胀,它们不仅会平白吞噬掉我们宝贵的硬盘空间,更会拖累机器的运行速度,影响我们的工作效率.本文介绍一下给 Linux 系统减肥的方法和工具的使用技巧,本文使用的 Linux 发行版本是 Ubuntu 12.04 .本文介绍的工具包括:Activity Log Manager.BleachBit.find.fdupes.Geeqie.GCon