KeyFansClub

首页 » - 特色讨论区 - » 键社茶餐厅 » [再次升级!没有最好,只有更好!] 昨天是UPS,今天是复印机... -_-b (内含独特促销附送程
Prz - 2006/1/20 16:45:00
其实是一个大缓存的文件复制工具。




使用Windows系统的复制/移动文件功能时,由于操作系统在底层进行时间片分割,因此文件读写操作非常频繁。

底层时间片分割本来是一件好事,可以避免某一个程序被随机的无期限阻塞。

但是,如果是在同一块物理硬盘上复制/移动文件(不通分区间),就会造成磁头快速的在读写柱面之间来回寻道,导致两大问题:
1. 噪音增加,对盘体的摩擦增加,发热增加,影响硬盘寿命。
2. 读写效率大大的降低,延长了操作时间。




针对这两个问题,我写了这个"高性能缓存复制程序",利用现在机器越配越大的内存,降低读写操作切换的频度,以求提高文件复制效率。

根据测试,在同一个硬盘的两个分区间复制文件,Windows 复制一个220MB文件用了大约50秒,本程序复制一个260MB的文件只用了40秒!


*** 升级版本提高了在同一物理硬盘的操作速度 10%
*** 升级版本提供了在不同物理硬盘的增强操作模式,提高性能一倍!


=== 第二升级版本增加了有用的快捷按钮!
=== 第二升级版本增加磁盘空间和文件大小预览!


(以下广告词)
本程序界面美观,操作方便,稳定可靠,是拥有大量的大文件收集者的居家旅行,杀人越货必备工具!


<<<<< 附送品介绍 >>>>>

64位文件切割器

由于历史原因,目前的绝大多数程序对文件的操作都限制在32位以内,由于超过4GB大文件的日益增多,导致了种种稀奇古怪的问题...

导致我做这个程序的起因是,很久以前下了一个Zip包,是一个某动画的1-26话全集,不过有个问题,这个文件超过了4G (5.8G),于是在WinRAR下打开,认为文件大小只有1.8G,导致只能解出前8话... XD

然后我又查找了N多号称支持64位Zip的程序(WinZip9, ZipForge64 ......) 但是没一个程序能够识别...估计目前64位程序还处于"战国"阶段,每家人开发一个自己的64位扩展Zip格式,也就只能解出自己的.... 但是我手头的Zip包里面没有任何特殊的标志可以识别出到底使用什么软件压缩的,只有一个标准的PK签名....

最后一个绝妙的主意出现了 - 把这个大文件分割成几个小块,这样保证WinRAR可以完整地看到整个小节的内容,然后使用修复模式把文件一部分一部分的提取出来...

但是想到了这个主意后我却Prz了....因为居然找不到一个能够支持分割大于4GB的文件的程序....于是这个程序就诞生了... XD

相信在目前情况下使用的机会不多,但是建议大家收集备用,因为一旦有需要用的时候,花上几个小时去找遍Google是比较划不来的... XD (貌似我经常做这样的事)

[Payview=32]
操作说明:

* 左边的为文件源
* 右边的为目标目录
* 中间的小鱼就是复制按钮
* 下面的托杆控制使用的缓存大小,默认16MB内存

-> 拖拉设定缓存大小
-> 在左边的文件框中选定需要复制的文件或者目录(可以Ctrl或者Shift多选) (选定的目录以及子目录下的所有文件都会被复制,包括空目录和0字节文件)
-> 在右面选定目标目录
-> 按下小鱼,自动开始复制,下方显示每一个文件的复制进度。
-> 如果任何时候希望停止操作,再按一下小鱼即可

++ 默认情况下,遇到操作错误(不能读/写文件/文件夹),或者遇到问题(覆盖文件?),程序会弹出提示框询问接下来的操作。
++ 选择"No Prompt",则程序不会弹出提示框,而是自动选择默认操作:
  + 如果不能建立目标目录,则跳过问题目录,继续复制其他文件/目录
  + 如果不能读原文件/写目标文件,则跳过问题文件,继续复制其他文件/目录
  + 如果目标文件已经存在,则跳过重名文件,继续复制其他文件/目录
  + 如果文件复制被打断(错误或者人工取消),则删除没有完成的副本

[URL=upload/KFCFile8272_CacheCopier.rar]最初版本[/URL]
[URL=upload/KFCFile8297_CacheCopier.rar]可调窗口版本+取消确认[/URL]



++++++ 升级版本 ++++++

* 首先修正了缓存写入结束时的同步磁盘操作,以前存在的问题对操作性能有影响。

  所以新的版本在同一个物理硬盘上复制文件时,性能平均比前一个版本提高10%左右。

  但是,如果在不同的物理硬盘上复制文件时,性能有所下降,这是正常现象,因为不同的情况下要使用的不同的模式才能获得最好的效果,请继续往下阅读...

* 原来窗口上不能选择的"Different HDD"现在可选!

  使用"Different HDD"模式,顾名思义,要求源文件和目标位置在不同的物理硬盘上。

  在这个模式下,指定的缓存将会被程序分成四块,当每一块被填满时,程序将会立刻开始向目标磁盘写数据,同时,读取源文件的过程将不会暂停,因此可以充分利用独立的硬件作并行操作。

  在不同的物理硬盘上复制文件时使用这个选项,将获得比前一个版本高大约一倍的性能!

  注意:程序不会对"不同的物理硬盘"这个条件做强行的要求,但是如果是往同一个硬盘上复制文件时选择该模式,那动作就和Windows本身的复制差不多了... -_-

[URL=upload/KFCFile8299_CacheCopier.rar]升级版本[/URL]




++++++ 本日第二次升级! ++++++

这一次增加了几个有用的按钮:

* 返回上层目录 (其实一直可以用快捷键BackSpace的,如果不知道的人就比较麻烦,还是加入好了)
* 刷新列表 (及时看到外部的改变)
* 删除 (可以直接把文件扔到回收站)

然后应要求增加了磁盘容量显示和文件大小预览:

-- Source部分 --
* 选定一个驱动器,窗口底端就会出现该分区的大小和剩余空间;
* 如果选定一个文件,则会出现这个文件的大小;

-- Destination部分 --
* 选定一个目录,这个目录所在的驱动器的大小和剩余空间就会以Hint(提示)的方式显示出来。

[URL=upload/KFCFile8322_CacheCopier.rar]第二次升级版本[/URL]



<<<<< 赠品 >>>>>

命令行程序...因为用到的机会少,也就没有做图形界面...XD

操作方法如下,有两种切割方法:
1> FXSplit <输入文件> <输出文件> <开始切割位置> <切割长度>
2> FXSplit <输入文件> <输出文件> <开始切割位置> - <结束切割位置>
(注意 第二种 开始和结束之间有一个减号)

[URL]upload/KFCFile8274_FXSplit.rar[/URL]

比如你有一个 6G 的文件: C:\test.bin

如果你想从第 4.5G 的地方提取出1G的东西,目前的能找到切割软件是基本没有办法的(至少我没有找到过)。
使用赠品,有两种方法:

1. 从第 4.5G 的地方开始,提取出1G:
> FxSplit C:\test.bin Z:\test.parts.bin 4831838208 1073741824

解释:
源文件 - C:\test.bin
目标文件 - Z:\test.parts.bin
开始位置 - 4831838208 (4.5G)
截取长度 - 1073741824 (1G)

(注意,强烈推荐将目标文件放在和源文件不在同一个物理硬盘的分区上,原因就不用解释了吧)


2. 从第 4.5G 的地方开始提取,直到5.5G的地方:
> FxSplit C:\test.bin Z:\test.parts.bin 4831838208 - 5905580032

解释:
源文件 - C:\test.bin
目标文件 - Z:\test.parts.bin
开始位置 - 4831838208 (4.5G)
模式标志 - -
结束位置 - 5905580032 (5.5G)

(注意,强烈推荐将目标文件放在和源文件不在同一个物理硬盘的分区上,原因就不用解释了吧)


[/Payview]
梦中有你 - 2006/1/20 16:46:00
沙发....

32个KP..........[em3]有种JS十足的感觉....(LZ大人...本人胡言乱语5454)
scegg - 2006/1/20 16:54:00
程序可能导致碎片众多,请测试后再决定。
紗紗 - 2006/1/20 16:57:00
以下引用scegg在2006-1-20 16:54:11的发言:
程序可能导致碎片众多,请测试后再决定。


没错,所以偶搞了个更好的=v=
Prz - 2006/1/20 16:58:00
以下引用scegg在2006-1-20 16:54:11的发言:
程序可能导致碎片众多,请测试后再决定。


降低读写的次数应该和文件的碎片没有关系吧...就算有影响,也只能是降低碎片吧....|||||||

磁盘的位图是由文件系统管理的,只有不停的关闭打开文件再续写才会造成分配策略的不连续——我的程序在写完之前,文件始终保持打开状态。
紗紗 - 2006/1/20 17:00:00
我的能续传喔~

可以控制程序优先级喔~

有记录文件喔~

你40s我才10s都不到喔!
极乐の逍遥 - 2006/1/20 17:02:00
啊啊.....吵起来了....

看热闹ING...对两个东西都不太了解..多吵吵让大家了解下....
紗紗 - 2006/1/20 17:07:00
以下引用极乐の逍遥在2006-1-20 17:02:57的发言:
啊啊.....吵起来了....

看热闹ING...对两个东西都不太了解..多吵吵让大家了解下....


明显是我的优势大N多嘛[em46]
Prz - 2006/1/20 17:20:00
Prz... 不要激动...我还没说完...

我的测试硬盘是 5400RPM的,而且接在USB2.0口上,并且每个分区都有80%使用中...

而且...请仔细读清楚,是在同一个物理硬盘上哦,如果是在两个不同的硬盘上的话,我的复制1GB也才35秒哦...
Prz - 2006/1/20 17:30:00
哦,还有....集成系统已经是上一个时代的做法了....现在提起“集成”,给人更多的联想是Spyware(间谍程序)...


现在流行的是"绿色软件",高效,简洁,不占宝贵的系统资源......为了减少开机登陆后硬盘狂响一秒钟,大家什么事情都干得出来,何必还要无谓的增加启动时间呢?

在同一硬盘大量的移动文件也不是经常要做的事,最优化的解决方案应该是为最普遍的情况考虑的,所以绿色软件>>集成软件!哈哈哈哈!
紗紗 - 2006/1/20 17:45:00
以下引用Prz在2006-1-20 17:30:25的发言:
哦,还有....集成系统已经是上一个时代的做法了....现在提起“集成”,给人更多的联想是Spyware(间谍程序)...


现在流行的是"绿色软件",高效,简洁,不占宝贵的系统资源......为了减少开机登陆后硬盘狂响一秒钟,大家什么事情都干得出来,何必还要无谓的增加启动时间呢?

在同一硬盘大量的移动文件也不是经常要做的事,最优化的解决方案应该是为最普遍的情况考虑的,所以绿色软件>>集成软件!哈哈哈哈!



顺便再批一下,调整优先级明显是画蛇添足...
首先,作者对文件系统的操作原理都没有搞清楚。
文件系统操作的绝大部分时间,是花在I/O等待上的,就算复制几十个GB的文件,真正程序运行的时间不会超过20秒!
所以,调整优先级不会带来可以察觉出的性能改变。
如果你的文件复制程序因为优先级的改变而产生明显的性能变化,就证明这个程序执行效率非常的低,导致占用了比较多的CPU时间。


同区10s[em46]
可选择不嵌入[em46]
处理线程优先,这个在你边听音乐边游戏边复制的时候是非常有用的,这也是为什么10s甚至1G 3s都不到的原因[em46]
还有,早就有预设这种东西了(你的想法太落后了吧)[em46]
Prz - 2006/1/20 17:49:00
以下引用紗紗在2006-1-20 17:00:59的发言:
我的能续传喔~

可以控制程序优先级喔~

有记录文件喔~

你40s我才10s都不到喔!



顺便再批一下,调整优先级明显是画蛇添足...

首先,这个"调整优先级功能"的作者对文件系统的操作原理都没有搞清楚。

文件系统操作的绝大部分时间,是花在I/O等待上的,就算复制几十个GB的文件,真正程序运行的时间不会超过20秒!
所以,调整优先级不会带来可以察觉出的性能改变。
如果你的文件复制程序因为优先级的改变而产生明显的性能变化,就证明这个程序执行效率非常的低,导致占用了比较多的CPU时间。



其次,使用低优先级的长时间I/O程序有可能导致其他程序的性能下降!

这个特殊现象叫做优先级逆转,具体机理比较复杂,希望对这方面了解更多的,可以去Google Scholar上面查阅操作系统调度(OS Scheduling)相关的论文。

简单的说,形成这种现象的原因就是,程序进行IO操作时需要靠CPU中断来激活睡眠的进程以继续运行。当低优先级进程进行大量的IO操作时,许多中断产生后不能及时地激活睡眠的进程(因为低优先级),这样累计的较多的中断后,当高优先级的进程需要进行I/O操作时,就会需要等候更长的时间...... XD



接下来...续传....搞不清楚这个功能到底有什么用...
难道你会在文件复制一半的时候关机或者注销?
然后第二天开机后想起来了再续传?
万一想不起来了呢?XD



最后,提一个愚蠢的问题:

谁会有闲心去给只运行一两分钟的程序调优先级? XD
Prz - 2006/1/20 17:52:00
以下引用紗紗在2006-1-20 17:45:57的发言:

同区10s[em46]
可选择不嵌入[em46]
处理线程优先,这个在你边听音乐边游戏边复制的时候是非常有用的,这也是为什么10s甚至1G 3s都不到的原因[em46]
还有,早就有预设这种东西了(你的想法太落后了吧)[em46]


哦,复制1G文件只需要3秒不到啊。
要是费米实验室的工程师能看懂你的话,估计就会抱着100万美金哭着找你要代码了.....

那你还在这里跟可怜巴巴得我抢什么KP呢?


顺便提一下 最新的SATA2.0 接口速度也才300MB/sec....
都不知道怎么形容你了...毫不容易想起了一句:

猿人造摩托——不懂科学
(要用川普来读才比较押韵...XD)
紗紗 - 2006/1/20 18:09:00
以下引用Prz在2006-1-20 17:49:06的发言:



顺便再批一下,调整优先级明显是画蛇添足...

首先,这个"调整优先级功能"的作者对文件系统的操作原理都没有搞清楚。

文件系统操作的绝大部分时间,是花在I/O等待上的,就算复制几十个GB的文件,真正程序运行的时间不会超过20秒!
所以,调整优先级不会带来可以察觉出的性能改变。
如果你的文件复制程序因为优先级的改变而产生明显的性能变化,就证明这个程序执行效率非常的低,导致占用了比较多的CPU时间。



其次,使用低优先级的长时间I/O程序有可能导致其他程序的性能下降!

这个特殊现象叫做优先级逆转,具体机理比较复杂,希望对这方面了解更多的,可以去Google Scholar上面查阅操作系统调度(OS Scheduling)相关的论文。

简单的说,形成这种现象的原因就是,程序进行IO操作时需要靠CPU中断来激活睡眠的进程以继续运行。当低优先级进程进行大量的IO操作时,许多中断产生后不能及时地激活睡眠的进程(因为低优先级),这样累计的较多的中断后,当高优先级的进程需要进行I/O操作时,就会需要等候更长的时间...... XD



接下来...续传....搞不清楚这个功能到底有什么用...
难道你会在文件复制一半的时候关机或者注销?
然后第二天开机后想起来了再续传?
万一想不起来了呢?XD



最后,提一个愚蠢的问题:

谁会有闲心去给只运行一两分钟的程序调优先级? XD



开机自动续传!不用每次都调优先级的![em40]

而且!有很多其他实用的复制功能的![em46]
wdx04 - 2006/1/20 21:42:00
买下。
我也写过一个文件切割程序,支持多种文件API(Win32,ANSI C,UNIX,C++,MMF),可以设置缓存大小,多种分割方式(分割块大小设定+分割范围设定+选取部分分割块+分割范围和分割块编号自动增量[用于以不同的分割大小连续分割一个文件]),支持低硬盘空间模式(用于一次性分割整个文件,且硬盘剩余空间小于待分割文件的情况)。
Rinrin - 2006/1/21 10:34:00
热烈的讨论啊^ ^
闇雨の绝 - 2006/1/21 10:57:00
不贵倒是不贵,反正目前不缺KP用
买下看看是啥~
============================================================
第一种蛮简单的
赠送品怎么用,给个实例~
wzwzw - 2006/1/21 11:00:00
又开始骗钱拉
LOVEHINA-AVC - 2006/1/21 15:20:00
1G 3S
目前的硬盘没有这个速度,是不是吹的我就不知道了

切割文件最快的方法是改FAT,在KERNEL MODE下调用FAT32/NTFS驱动实现直接数据分割,当然原来的文件会不复存在XD

PS:关于MISHA解释的补充——如果是单线程的话,线程优先级对于处在NTSTATUS_IO_PENDING状态的程序来说是无意义的,线程调度机制会在IO操作返回或被另外一个线程取消后才激活这个线程
Rinrin - 2006/1/21 17:19:00
以下引用LOVEHINA-AVC在2006-1-21 15:20:18的发言:
1G 3S
目前的硬盘没有这个速度,是不是吹的我就不知道了

切割文件最快的方法是改FAT,在KERNEL MODE下调用FAT32/NTFS驱动实现直接数据分割,当然原来的文件会不复存在XD

PS:关于MISHA解释的补充——如果是单线程的话,线程优先级对于处在NTSTATUS_IO_PENDING状态的程序来说是无意义的,线程调度机制会在IO操作返回或被另外一个线程取消后才激活这个线程

老兄
这还要写个驱动么
真危险啊orz......
旭日晨升 - 2006/1/21 19:13:00
两位前辈的技术果然高超……景仰佩服ing
(试验了一下,效果果然不错……谢谢前辈了)
03534 - 2006/1/21 20:05:00
程序窗口大小不能随意控制……
orz
紗紗 - 2006/1/21 20:08:00
以下引用03534在2006-1-21 20:05:04的发言:
程序窗口大小不能随意控制……
orz


我的能控制[em44]
Tenlix - 2006/1/21 20:11:00
争论已经持续两天了么……汗一个……
03534 - 2006/1/21 20:12:00
以下引用紗紗在2006-1-21 20:08:54的发言:
我的能控制[em44]
你的那个下载空间老是RP[em34]······
找个好些的空间上传再说…………
[em34]·········
紗紗 - 2006/1/21 20:13:00
以下引用03534在2006-1-21 20:12:10的发言:
你的那个下载空间老是RP[em34]······
找个好些的空间上传再说…………
[em34]·········


相熟的人可以直接用QQ找我要啊[em10]
Prz - 2006/1/22 0:26:00
以下引用03534在2006-1-21 20:05:04的发言:
程序窗口大小不能随意控制……
orz


意义不大吧.... 如果你需要控制的话我可以直接改掉窗口属性为Sizable就行了...

但是,就像我说过的,如果这个程序一星期只用3分钟的话,估计没有谁会去关心窗口上有多少花哨的控件、能不能调优先级、可不可以调整窗口大小....

顺便预告最近准备推出的升级版:
1. 支持拖放,只需要把源文件从Expolrer拖放到窗口,程序就会自动把源设定到该目录并选定这些文件,你只需要选定目的地,然后按下小鱼就行了

2. Different HDD模式将可选择,如果你的源和目标是不同的物理硬盘,选择这个将会极大地提高复制速度(约为同的HDD的两倍)

3. 增加取消操作确认 - 这样也就相当于增加了暂停、继续功能,这个功能在某些特殊情况下非常有用——比如复制过程中,另一个应用程序突然开始大量的操作源或者目标磁盘,造成效率成倍下降,这个时候只要人工暂停等待其他的程序操作完成后再继续,可以节约至少一倍的时间。
LOVEHINA-AVC - 2006/1/22 2:49:00
以下引用Rinrin在2006-1-21 17:19:50的发言:

老兄
这还要写个驱动么
真危险啊orz......


不需要的。相关的文章很好找,我们可以用BUG直接进RING0,到GDT那里改一个软中断,然后随便就是KERNEL MODE了……XD
Sonic^Destiny - 2006/1/22 2:54:00
看了半天不知道这个有什么用?硬盘使用NTFS还需要这个吗?
Prz - 2006/1/22 8:17:00
以下引用闇雨の绝在2006-1-21 10:57:37的发言:
赠送品怎么用,给个实例~


比如你有一个 6G 的文件: C:\test.bin

如果你想从第 4.5G 的地方提取出1G的东西,目前的能找到切割软件是基本没有办法的(至少我没有找到过)。
使用赠品,有两种方法:

1. 从第 4.5G 的地方开始,提取出1G:
> FxSplit C:\test.bin Z:\test.parts.bin 4831838208 1073741824

解释:
源文件 - C:\test.bin
目标文件 - Z:\test.parts.bin
开始位置 - 4831838208 (4.5G)
截取长度 - 1073741824 (1G)

(注意,强烈推荐将目标文件放在和源文件不在同一个物理硬盘的分区上,原因就不用解释了吧)


2. 从第 4.5G 的地方开始提取,直到5.5G的地方:
> FxSplit C:\test.bin Z:\test.parts.bin 4831838208 - 5905580032

解释:
源文件 - C:\test.bin
目标文件 - Z:\test.parts.bin
开始位置 - 4831838208 (4.5G)
模式标志 - -
结束位置 - 5905580032 (5.5G)

(注意,强烈推荐将目标文件放在和源文件不在同一个物理硬盘的分区上,原因就不用解释了吧)
12
查看完整版本: [再次升级!没有最好,只有更好!] 昨天是UPS,今天是复印机... -_-b (内含独特促销附送程