- /*
- * JS版文本分割器 @BY Broly
- * Broly's Blog:www.dreamlikes.net
- * From bbs.bathome.net
- *
- * 简要说明:
- * 我已经将分割文本的函数做了封装,
- * 只要简单初始化就可以进行分割。
- *
- * 已知缺点:
- * 1.只支持GBK,Unicode,UFT8三种编码,
- * 其他编码处理后可能出现乱码。
- * 因为其他编码格式不常用,我就
- * 没有进行处理了。
- * 2.虽然说可以按照处理后的数量或者
- * 大小分割,实际只能够精确处理
- * Unicode编码的文本。这个是不得
- * 已的做法,因为以我的能力,只
- * 有这样才不会出现乱码。
- *
- * 封装的对象:Spliter(filepath,savepath)
- * filepath: 要分割的目标文本
- * savepath: 存储文件的目录
- * 属性:
- * filepath: 要分割的目标文本
- * savepath: 存储文件的目录
- *
- * 方法:
- * checkEncoding(filepath): 检测文本编码
- * filepath: 要分割的目标文本
- * splitOnSize(size): 按大小进行分割
- * size:分割的大小,单位KB
- * splitOnCount(): 按照数量分割
- * count:分割的份数,正整数
- *
- */
-
-
- /*##############分####隔####线###################*/
- function Spliter(_filepath,_savepath)
- {
- //内部函数:出错提示
- function msgError(msg)
- {
- WScript.Echo(msg);
- WScript.Quit();
- }
-
- //定义判断文件编码的方法
- function _checkEncoding(filepath)
- {
- //定义变量以存储文件BOM
- var bom,encoding;
- //初始化Adodb.Stream对象
- var objStream = new ActiveXObject("Adodb.Stream");
- with(objStream)
- {
- type = 2;
- mode = 3;
- charset = "437";
- open();
- loadFromFile(filepath);
- bom = readtext(2);
- close();
- }
- //用escape()函数返回字符十六进制
- switch(escape(bom))
- {
- // FF FE
- case '%A0%u25A0':
- encoding = 'Unicode';
- break;
-
- // EF BB
- case '%u2229%u2557':
- encoding = 'UTF-8';
- break;
-
- //默认是GBK,如果都不是这三种编码处理后有可能出现乱码
- default:
- encoding = 'GBK';
- break;
- }
- //释放内存
- objStream = null;
-
- //返回编码类型
- return encoding;
- }
-
- //获取文件信息函数,在内部使用
- function getFileSize(filepath,savepath)
- {
- var fso = new ActiveXObject("Scripting.FileSystemObject");
-
- try
- {
- if(!fso.FileExists(filepath))
- {
- throw "源文件不存在";
- }
-
- var filesize = fso.GetFile(filepath).Size;
-
- if(filesize == 0)
- {
- throw "文件为空或者不存在";
- }
-
- if(!fso.FolderExists(savepath))
- {
- throw "存储目录不存在";
- }
-
- }
- catch(ex)
- {
- msgError(ex);
- }
-
- //释放内存
- fso = null;
-
- return filesize;
- }
-
-
- //内部使用,分割文件
- function splitFile(filepath,savepath,singlesize,srCharset)
- {
- var objStream = new ActiveXObject("Adodb.Stream");
- var arr = new Array();
- objStream.Mode = 3;
- var i = 0;
-
- with(objStream)
- {
- if(srCharset!='Unicode')
- {
- type = 2;
- charset = srCharset;
- open();
- loadFromFile(filepath);
- strText = readtext();
- close();
- charset = 'Unicode';
- open();
- writetext(strText);
- position = 0;
- type = 1;
- } else {
- type = 1;
- open();
- loadFromFile(filepath);
- }
-
- arr[0] = read(2);
- while(!EOS){arr[++i] = read(singlesize);}
- close();
- type = 2;
- charset = srCharset;
- }
-
- for(i = 1 ; i<arr.length ; i++)
- {
- with(objStream)
- {
- open();
- writetext(arr[i]);
- saveToFile(savepath + '\\book' + i + '.txt',2);
- close();
- }
- }
-
- //释放内存
- delete arr;
- objStream = null;
- }
-
- //定义按照大小分割的方法,单位KB
- function _splitOnSize(size)
- {
- getFileSize(this.filepath,this.savepath);
- //获取比较大的单文件字节
- var size1 = size*1024;
- var size2 = Math.round(size1);
- var singlesize = size2>=size1 ? size2 : size2+1;
- if(singlesize%2 !=0 ) {singlesize+=1;}
- splitFile(this.filepath,
- this.savepath,
- singlesize,
- _checkEncoding(this.filepath)
- );
- }
-
- //定义按照数量分割的方法
- function _splitOnCount(count)
- {
- var filesize = getFileSize(this.filepath,this.savepath);
- //获取比较大的单文件字节
- var size1 = filesize/count;
- var size2 = Math.round(size1);
- var singlesize = size2>=size1 ? size2 : size2+1;
- if(singlesize%2 !=0 ) {singlesize+=1;}
- splitFile(this.filepath,
- this.savepath,
- singlesize,
- _checkEncoding(this.filepath)
- );
- }
-
- //定义属性
- this.filepath = _filepath;
- this.savepath = _savepath;
-
- //定义方法
- this.checkEncoding = _checkEncoding;
- this.splitOnSize = _splitOnSize;
- this.splitOnCount = _splitOnCount;
-
- }
-
- /*##############分####隔####线###################*/
-
- //例子:
- var objSpliter = new Spliter('d:\\诛仙.txt','d:\\诛仙');
-
- objSpliter.splitOnCount(3);
- objSpliter = null;
-
- WScript.Echo('Succeed.');
复制代码
|