完美者(wmzhe.com)网站以软件下载为基础,改版后的网站对功能性板块进行扩充,以期能够解决用户在软件使用过程中遇见的所有问题。网站新增了“软件百科”、“锦囊妙技”等频道,可以更好地对用户的软件使用全周期进行更加专业地服务。
NoClone(无双)是一款重复文件搜索及清理工具。可帮助你快速的在硬盘上搜索重复的文件,可根据文件大小、名称、内容多种方式判断文件是否相同。NoClone亦可搜寻重复的文件名、未完成下载文件及“相似”的文件。NoClone支持DLL、图片、影片、音乐、文本等文件,帮助你找回被浪费的磁盘空间。软件为多国语言版,支持繁体中文,运行程序后,点击“Search Session”中的“Language”,选择“Traditional Chinese”即可在软件重启后使用中文界面。
1.搜寻
-即使档案的名称不一样也可辨识出是重复
-亦可搜寻重复的档名、不完成下载及「相似」的档案
-重复的档案是内容上完成一样的,不用CRC,所以非常安全
-可用来搜寻任何类型档案:DLL、图片、影片、音乐、文件等
2.复核
-显示档案版本及属性
-预览图片档案
3.移除
-醒目地选择要清除的档案,根据日期、版本、大小、位置及名称
-多个移除选项:清除、移动及复制档案
4.搜寻结果
-可储存搜寻结果和重复档案清单
-可汇出CSV格式,供其它电子表格及数据库程序使用
5.好处
-省回浪费的空间
-减少备份时间及所用的媒体
-减少搜寻档案的时间
-省却不必要的扫瞄病毒的时间
-在有限的硬盘空间,如手提电脑
-清除重复档案,避免档案同步问题
-清理硬盘及服务器的档案
"锦囊妙技"栏目是聚合全网软件使用的技巧或者软件使用过程中各种问题的解答类文章,栏目设立伊始,小编欢迎各路软件大神朋友们踊跃投稿,在完美者平台分享大家的独门技巧。
本站文章素材来源于网络,大部分文章作者名称佚失,为了更利于用户阅读和使用,根据需要进行了重新排版和部分改编,本站收录文章只是以帮助用户解决实际问题为目的,如有版权问题请联系小编修改或删除,谢谢合作。
软件大小:6.16 MB
用这个注册版的吧,里面有注册机,自己算下! 查看更多答案>>
尽量不要这样做,你想删除重复文件的话,先要排除系统盘,一般是C盘,因为系统盘上会有很多重复的文件,但是在不同的目录下,删除的话可能会影响到系统,所以请不要删除,以防万一.其他盘的话,如果你没有重要数据,可以删除,不影响系统.
一款名为NoClone的软件,这是一个专门查找和删除重复文件的工具,它可以帮助你快速的在硬盘上搜索重复的文件,可以把本机硬盘上甚至整个局域网上所有同名的文件、内容完全相同的重复文件、0字节文件、内容头部相同及内容“相似”的文件全部找出来,帮助你找回被浪费的磁盘空间。软件的使用很简单,双击桌面上的图标 或者点击“开始→程序→Reasonable NoClone→NoClone”即可运行该软件。进入软件主界面(如图1)1、设置搜索范围在NoClone主界面中,查看“Select Paths”项目中的“Paths”标签页,在其中的下拉列表中输入搜索路径。大家点击下拉箭头按钮,程序已预置的我的文档及桌面等常用搜索目标,即使用户已更改此类系统文件夹的默认路径,程序也会正确识别其路径。也可以通过“Browse”按钮选出要搜索的目录或驱动器。此后,在“File type”选项中设置文件类型,默认为搜索所有文件。而如果你希望有针对性地搜索电影剪辑、音乐、图像或下载文件,则直接在其下拉列表中选择即可。需要注意的是,程序所预置的各类别文件,仅包含了国际间流行的常用格式,我们在实际应用中需略作改动。例如下载文件类别仅显示有EXE与ZIP格式(如图2),我们需手动添加在国内大行其道的RAR格式。2、限定文件大小切换到“File Size”标签页中,在此分别设置最大与最小文件容量上限(如图3),建议要避免搜索容量过大的文件,以免影响搜索效率.3、设置文件修改日期切换到“Date”标签页,在“Date modified”下拉列表中选择文件修改日期,除了程序预定的日期选项外,若想自定义日期,可选择“Specified”(如图4)。以上步骤设置完毕后,点击“Add”按钮将当前搜索条件添加至下面的列表中(如图5)。4、选择搜索类型我们查看右侧视图中的“Search type”下拉列表,在此可设置搜索类型,要充分利用这里提供的选项,达到按需搜索重复文件的目的(如图6)。“Zero Size”:表示是要搜索0字节文件,这些文件一般都是一些无用的临时文件,可以放心的删除。“Duplicates”:重复的文件副本。有些重复文件虽然已改名换姓,但NoClone也可以轻松把它找出。对搜索出的这些重复文件,NoClone把它放在一起用相同的颜色来显示出来,我们可以通过显示出来的日期、版本、大小、位置等信息来选择要清除的文件。如果是图像文件,我们还可以通过右边的“Priview”窗口来预览。“Same File Name”:名字相同的文件。这里有部分文件是名字相同内容不同,有部分则为一些重复的副本。由于名字相同,在管理上同样会出现麻烦,因此对内容不同但名字相同的文件,我们最好通过改名的方法来解决。点击右侧的“Define”按钮可以进行更多的设置,弹出如下窗口(如图7)如果我们勾选“Simple fuzzy match”这个选项,还可以对“相似”的文件进行查找。一些通过P2P软件下载来的文件,往往在传输中会出现错误但被忽略,在查找这些文件是否有重复的副本时,只要把“Search Options”中的“Simple fuzzy match”选上,就可忽略文件间的一些细小差异来进行查找了。但这个选项只对大文件有效,较小的文件通常是找不出来的。 5、搜索重复文件我们点击“Search”按钮,即可执行搜索操作。当搜索完毕后,我们将在提示对话框中获知已比较的文件数量以及查找出的符合要求的重复文件数量(如图8)。6、清除重复文件从搜索结果列表中我们可以看到重复文件按不同的颜色分组,简单明了(如图9)。在界面右侧有一个“Task”按钮,可以进行文件的重命名、删除等操作(如图10)。我们查看界面下端的搜索结果列表,只要在要进行处理的文件前面的方格中打上勾,然后点击这个“Task”按钮,再在弹出的菜单中选择相应的命令进行操作即可。此前,可选择输出结果列表,以便以后调用。经过一番的整理,我们的硬盘就可以变得苗条了。NoClone是一款相当智能化的重复文件搜索工具,尤其是搜索条件不只限于常规的文件名及大小,增强了重复文件判定的灵活性,几乎能够使得重复文件无一漏网。您如果正在为硬盘的重复文件而烦恼的话,不妨一试。这里是NoClone 3.2.55 汉化版的下载地址: http://www.newhua.com/soft/31159.htm#down
DOM操作包括append、prepend、before、after、replaceWith、appendTo、prependTo、insertBefore、insertAfter、replaceAll。其核心处理函数是domManip。 DOM操作函数中后五种方法使用的依然是前面五种方法,源码 jQuery.each({ appendTo: "append", prependTo: "prepend", insertBefore: "before", insertAfter: "after", replaceAll: "replaceWith" }, function( name, original ) { jQuery.fn[ name ] = function( selector ) { var elems, i = 0, ret = [], insert = jQuery( selector ), last = insert.length - 1; for ( ; i <= last; i++ ) { elems = i === last ? this : this.clone(true); jQuery( insert[i] )[ original ]( elems ); //现代浏览器调用apply会把jQuery对象当如数组,但是老版本ie需要使用.get() core_push.apply( ret, elems.get() ); } return this.pushStack( ret ); }; }); 浏览器原生的插入节点的方法有两个:appendChild和inserBefore,jQuery利用这两个方法拓展了如下方法 jQuery.fn.append使用this.appendChild( elem ) jQuery.fn.prepend使用this.insertBefore( elem, this.firstChild ) jQuery.fn.before使用this.parentNode.insertBefore( elem, this ); jQuery.fn.after使用this.parentNode.insertBefore( elem, this.nextSibling ); jQuery.fn.replaceWith 使用this.parentNode.insertBefore( elem, this.nextSibling); 看一个例子的源码(jQuery.fn.append) append: function() { return this.domManip(arguments, true, function( elem ) { if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { this.appendChild( elem ); } }); } 根据上面的源码。猜测domManip的作用是遍历当前jQuery对象所匹配的元素,然后每个元素调用传入的回调,并将要插入的节点(如果是字符串那么需要创建文档碎片节点)作为传入的回调的参数;并执行传入的回调。 接下来分析domManip,看猜测是否正确。dom即Dom元素,Manip是Manipulate的缩写,连在一起的字面意思就是就是Dom操作。 a. domManip: function( args, table, callback )解析 args 待插入的DOM元素或HTML代码 table 是否需要修正tbody,这个变量是优化的结果 callback 回调函数,执行格式为callback.call( 目标元素即上下文, 待插入文档碎片/单个DOM元素 ) 先看流程,再看细节 第一步,变量初始化。其中iNoClone在后面会用到,如果当前的jQuery对象所匹配的元素不止一个(n > 1)的话,意味着构建出来的文档碎片需要被n用到,则需要被克隆(n-1)次,加上碎片文档本身才够n次使用;value 是第一个参数args的第一个元素,后面会对value是函数做特殊处理; var first, node, hasScripts, scripts, doc, fragment, i = 0, l = this.length, set = this, iNoClone = l - 1, value = args[0], isFunction = jQuery.isFunction( value ); 第二步,处理特殊下要将当前jQuery对象所匹配的元素一一调用domManip。这种特殊情况有两种:第一种,如果传入的节点是函数(即value是函数)则需要当前jQuery对象所匹配的每个元素都将函数计算出的值作为节点代入domManip中处理。第二种,webkit下,我们不能克隆文含有checked的文档碎片;克隆的文档不能重复使用,那么只能是当前jQuery对象所匹配的每个元素都调用一次domManip处理。 //webkit下,我们不能克隆文含有checked的档碎片 if ( isFunction || !( l <= 1 || typeof value !== "string" || jQuery.support.checkClone || !rchecked.test( value ) ) ) { return this.each(function( index ) { var self = set.eq( index ); //如果args[0]是函数,则执行函数返回结果替换原来的args[0] if ( isFunction ) { args[0] = value.call( this, index, table ? self.html() : undefined ); } self.domManip( args, table, callback ); }); } 第三步,处理正常情况,使用传入的节点构建文档碎片,并插入文档中。这里面构建的文档碎片就需要重复使用,区别于第二步的处理。这里面需要注意的是如果是script节点需要在加载完成后执行。顺着源码顺序看一下过程 构建文档碎片 fragment = jQuery.buildFragment( args, this[ 0 ].ownerDocument, false, this ); first = fragment.firstChild; if ( fragment.childNodes.length === 1 ) { fragment = first; } 分离出其中的script,这其中有一个函数disableScript更改了script标签的type值以确保安全,原来的type值是"text/javascript",改成了"true/text/javascript"或"false/text/javascript" scripts = jQuery.map( getAll( fragment, "script" ), disableScript ); hasScripts = scripts.length; 文档碎片插入页面 for ( ; i < l; i++ ) { node = fragment; if ( i !== iNoClone ) { node = jQuery.clone( node, true, true ); // Keep references to cloned scripts for later restoration if ( hasScripts ) { jQuery.merge( scripts, getAll( node, "script" ) ); } } callback.call( table && jQuery.nodeName( this[i], "table" ) ? findOrAppend( this[i], "tbody" ) : this[i], node, i ); } 执行script,分两种情况,远程的使用ajax来处理,本地的直接执行。 if ( hasScripts ) { doc = scripts[ scripts.length - 1 ].ownerDocument; // Reenable scripts jQuery.map( scripts, restoreScript ); //在第一个文档插入使执行可执行脚本 for ( i = 0; i < hasScripts; i++ ) { node = scripts[ i ]; if ( rscriptType.test( node.type || "" ) && !jQuery._data( node, "globalEval" ) && jQuery.contains( doc, node ) ) { if ( node.src ) { // Hope ajax is available... jQuery.ajax({ url: node.src, type: "GET", dataType: "script", async: false, global: false, "throws": true }); } else { jQuery.globalEval( ( node.text || node.textContent || node.innerHTML || "" ).replace( rcleanScript, "" ) ); } } } } b. dom操作拓展 jQuery.fn.text jQuery.fn.text: function( value ) { return jQuery.access( this, function( value ) { return value === undefined ? jQuery.text( this ) : this.empty().append( ( this[0] && this[0].ownerDocument || document ).createTextNode( value ) ); }, null, value, arguments.length ); } 最终执行value === undefined ? jQuery.text( this ) : this.empty().append( ( this[0] && this[0].ownerDocument || document ).createTextNode( value ) ); 其中jQuery.text = Sizzle.getText; jQuery.fn.html 函数使用jQuery.access来处理 jQuery.fn.html: function( value ) { return jQuery.access( this, function( value ) {...}, null, value, arguments.length ); } 如果没有参数表示是取值 if ( value === undefined ) { return elem.nodeType === 1 ? elem.innerHTML.replace( rinlinejQuery, "" ) : undefined; } 否则看是否能用innerHTML添加内容。点击参考兼容问题 //看看我们是否可以走了一条捷径,只需使用的innerHTML //需要执行的代码script|style|link等不能使用innerHTML //htmlSerialize:确保link节点能使用innerHTML正确序列化,这就需要在IE浏览器的包装元素 //leadingWhitespace:IE strips使用.innerHTML需要以空白开头 //不是需要额外添加结束标签或外围包装标签的元素 if ( typeof value === "string" && !rnoInnerhtml.test( value ) && ( jQuery.support.htmlSerialize || !rnoshimcache.test( value ) ) && ( jQuery.support.leadingWhitespace || !rleadingWhitespace.test( value ) ) && !wrapMap[ ( rtagName.exec( value ) || ["", ""] )[1].toLowerCase() ] ) { value = value.replace( rxhtmlTag, "<$1></$2>" ); try { for (; i < l; i++ ) { //移除元素节点和缓存,阻止内存泄漏 elem = this[i] || {}; if ( elem.nodeType === 1 ) { jQuery.cleanData( getAll( elem, false ) ); elem.innerHTML = value; } } elem = 0; //如果使用innerHTML抛出异常,使用备用方法 } catch(e) {} } 如果不能使用innerHTML或使用不成功(抛出异常),则使用备用方法append //备用方法,使用append添加节点 if ( elem ) { this.empty().append( value ); } jQuery.fn.wrapAll(用单个标签将所有匹配元素包裹起来) 处理步骤: 传入参数是函数则将函数结果传入 if ( jQuery.isFunction( html ) ) { return this.each(function(i) { jQuery(this).wrapAll( html.call(this, i) ); }); } 创建包裹层 //获得包裹标签 The elements to wrap the target around var wrap = jQuery( html, this[0].ownerDocument ).eq(0).clone(true); if ( this[0].parentNode ) { wrap.insertBefore( this[0] ); } 用包裹裹住当前jQuery对象 wrap.map(function() { var elem = this; while ( elem.firstChild && elem.firstChild.nodeType === 1 ) { elem = elem.firstChild; } return elem; }).append( this ); 注意:当前jQuery对象匹配的元素最好只有一个,如果有多个的话不推荐使用,这种情况慎用,后面举例可以看到。 简单的例子,原DOM为(后面都使用这个例子) <div id='center' class="center"> <div id='ss' class="center"> <input type='submit' id='left' class="left"> </div> </div> <div class="right">我是right</div> $('#center').wrapAll("<p></p>")后,dom变成了 <p> <div id="center" class="center"> <div id="ss" class="center"> <input type="submit" id="left" class="left"> </div> </div> </p> <div class="right">我是right</div> 慎用:如果当前jQuery所匹配的元素不止一个,例如原DOM执行$('div').wrapAll(“<p></p>”)后结果DOM变成 <p> <div id="center" class="center"></div> <div id="ss" class="center"> <input type="submit" id="left" class="left"> </div> <div class="right">我是right</div> </p> 看到结果了吧,本来#center是#ss的父节点,结果变成了#ss的兄弟节点。 jQuery.fn.wrapInner(在每个匹配元素的所有子节点外部包裹指定的HTML结构) 处理步骤: 传入参数是函数则将函数结果传入 if ( jQuery.isFunction( html ) ) { return this.each(function(i) { jQuery(this).wrapInner( html.call(this, i) ); }); } 遍历jQuery对象数组,获取每个元素包含的内容(所有子节点)contents,然后使用warpAll包裹住contents return this.each(function() { var self = jQuery( this ), contents = self.contents(); if ( contents.length ) { contents.wrapAll( html ); } else { self.append( html ); } }); 还是使用上面的例子中的原DOM,执行$('div').wrapInner('<p></p>')后结果DOM变成 <div id="center" class="center"> <p> <div id="ss" class="center"> <p> <input type="submit" id="left" class="left"> </p> </div> </p> </div> <div class="right"> <p> 我是right </p> </div> jQuery.fn.wrap(在每个匹配元素外部包裹指定的HTML结构) 对jQuery的每个元素分别使用wrapAll包裹一下 return this.each(function(i) { jQuery( this ).wrapAll( isFunction ? html.call(this, i) : html ); }); 行$('div').wrap('<p></p>')后结果DOM变成 <p> <div id="center" class="center"> <p> <div id="ss" class="center"> <input type="submit" id="left" class="left"> </div> </p> </div> </p> <p> <div class="right">我是right</div> </p> jQuery.fn.unwrap(移除每个匹配元素的父元素) 使用replaceWith用匹配元素父节点的所有子节点替换匹配元素的父节点。当然了父节点是body/html/document肯定是移除不了的 return this.parent().each(function() { if ( !jQuery.nodeName( this, "body" ) ) { jQuery( this ).replaceWith( this.childNodes ); } }).end(); 执行$('div').wrap()后结果DOM变成 <div id="ss" class="center"> <input type="submit" id="left" class="left"> </div> <div class="right">我是right</div> jQuery.fn.remove(从文档中移除匹配的元素) 你还可以使用选择器进一步缩小移除的范围,只移除当前匹配元素中符合指定选择器的部分元素。 与detach()相比,remove()函数会同时移除与元素关联绑定的附加数据( data()函数 )和事件处理器等(detach()会保留)。 for ( ; (elem = this[i]) != null; i++ ) { if ( !selector || jQuery.filter( selector, [ elem ] ).length > 0 ) { // detach传入的参数keepData为true,不删除缓存 if ( !keepData && elem.nodeType === 1 ) { //清除缓存 jQuery.cleanData( getAll( elem ) ); } if ( elem.parentNode ) { if ( keepData && jQuery.contains( elem.ownerDocument, elem ) ) { setGlobalEval( getAll( elem, "script" ) ); } elem.parentNode.removeChild( elem ); } } } 可以看到其中有一个重要的函数cleanData,该方法是用来清除缓存:遍历每一个节点元素,对每一个节点元素做一下处理: 1.获取当前元素对应的缓存 id = elem[ internalKey ]; data = id && cache[ id ]; 2.如果有绑定事件,则遍历解绑事件 if ( data.events ) { for ( type in data.events ) { if ( special[ type ] ) { jQuery.event.remove( elem, type ); //这是一个快捷方式,以避免jQuery.event.remove的开销 } else { jQuery.removeEvent( elem, type, data.handle ); } } } 3.如果jQuery.event.remove没有移除cache,则手动移除cache。其中IE需要做一些兼容处理,而且最终会将删除历史保存如core_deletedIds中 //当jQuery.event.remove没有移除cache的时候,移除cache if ( cache[ id ] ) { delete cache[ id ]; //IE不允许从节点使用delete删除expando特征, //也能对文件节点使用removeAttribute函数; //我们必须处理所有这些情况下, if ( deleteExpando ) { delete elem[ internalKey ]; } else if ( typeof elem.removeAttribute !== core_strundefined ) { elem.removeAttribute( internalKey ); } else { elem[ internalKey ] = null; } core_deletedIds.push( id ); } jQuery.fn.detach detach: function( selector ) { return this.remove( selector, true ); }, jQuery.fn.empty(清空每个匹配元素内的所有内容(所有子节点)) 函数将会移除每个匹配元素的所有子节点(包括文本节点、注释节点等所有类型的节点),会清空相应的缓存数据。 for ( ; (elem = this[i]) != null; i++ ) { //防止内存泄漏移除元素节点缓存 if ( elem.nodeType === 1 ) { jQuery.cleanData( getAll( elem, false ) ); } //移除所有子节点 while ( elem.firstChild ) { elem.removeChild( elem.firstChild ); } // IE<9,select节点需要将option置空 if ( elem.options && jQuery.nodeName( elem, "select" ) ) { elem.options.length = 0; } }