UNPKG

cejs

Version:

A JavaScript module framework that is simple to use.

1,864 lines (1,657 loc) 75.1 kB
/** * @name CeL file function for Windows * @fileoverview * 本檔案包含了 Windows 的檔案/文件管理 functions。 * * use 'application.storage' instead * * @since 2009/12/1 */ /* * @see * JScript Language Reference (Windows Scripting - JScript) * http://msdn.microsoft.com/en-US/library/yek4tbz0%28v=VS.84%29.aspx * * TODO: * http://www.comsharp.com/GetKnowledge/zh-CN/It_News_K869.aspx */ 'use strict'; if (typeof CeL === 'function') CeL.run( { name : 'application.OS.Windows.file', //data.set_Object_value|application.locale.encoding.guess_encoding require : 'data.code.compatibility.|application.OS.Windows.new_COM|application.OS.Windows.is_COM|application.storage.file.is_absolute_path|data.file.file_system_structure', code : function(library_namespace) { //requiring var new_COM = this.r('new_COM'), is_COM = this.r('is_COM'), // set_Object_value = this.r('set_Object_value'), is_absolute_path = this.r('is_absolute_path'), file_system_structure = this.r('file_system_structure'); var module_name = this.id; /** * null module constructor * @class Windows 下,檔案操作相關之 function。 */ var _// JSDT:_module_ = function() { // null module constructor }; /** * for JSDT: 有 prototype 才會將之當作 Class */ _// JSDT:_module_ .prototype = { }; /* JScript only ------------------------------------------------------- */ // 經驗法則。並非依照規格書。 function is_ADO_Stream(object) { //library_namespace.debug('is_COM: ' + is_COM(object), 2); //library_namespace.debug('typeof object.SetEOS: ' + typeof object.SetEOS, 2); //library_namespace.debug('typeof object.LoadFromFile: ' + typeof object.LoadFromFile, 2); return is_COM(object) && typeof object.LoadFromFile === 'unknown'; }; _// JSDT:_module_ . is_ADO_Stream = is_ADO_Stream; // 經驗法則。並非依照規格書。 function is_FSO(object) { return is_COM(object) && typeof object.FileExists === 'unknown' && typeof object.GetFile === 'unknown'; }; _// JSDT:_module_ . is_FSO = is_FSO; _// JSDT:_module_ . /** * FileSystemObject Object I/O mode enumeration. * @see <a href="http://msdn.microsoft.com/en-US/library/314cz14s.aspx" accessdate="2009/11/28 17:42" title="OpenTextFile Method">OpenTextFile Method</a> * @_memberOf _module_ */ IO_mode = { // * @_description <a href="#.IO_mode">IO_mode</a>: Open a file for reading only. You can't write to this file. /** * Open a file for reading only. You can't write to this file. * @_memberOf _module_ */ ForReading : 1, /** * Open a file for writing. * @_memberOf _module_ */ ForWriting : 2, /** * Open a file and write to the end of the file. * @_memberOf _module_ */ ForAppending : 8 }; _// JSDT:_module_ . /** * FileSystemObject Object file open format enumeration. * @see <a href="http://msdn.microsoft.com/en-US/library/314cz14s.aspx" accessdate="2009/11/28 17:42" title="OpenTextFile Method">OpenTextFile Method</a> * @_memberOf _module_ */ open_format = { /** * Opens the file using the system default. * @_memberOf _module_ */ TristateUseDefault : -2, /** * Opens the file as Unicode. * @_memberOf _module_ */ TristateTrue : -1, /** * Opens the file as ASCII. * @_memberOf _module_ */ TristateFalse : 0 }; var WshShell = new_COM("WScript.Shell"), /** {String}path separator. e.g., '/', '\' */ path_separator = library_namespace.env.path_separator, path_separator_pattern = library_namespace.env.path_separator_pattern, line_separator = library_namespace.env.line_separator, /** * FileSystemObject * @inner * @ignore * @see * <a href="http://msdn.microsoft.com/en-US/library/z9ty6h50%28VS.85%29.aspx" accessdate="2010/1/9 8:10">FileSystemObject Object</a> * Scripting Run-Time Reference/FileSystemObject * http://msdn.microsoft.com/en-US/library/hww8txat%28v=VS.84%29.aspx */ FSO = new_COM("Scripting.FileSystemObject"), // XMLHttp, WinShell // initialization_WScript_Objects , args, ScriptHost; /* ↑JScript only ------------------------------------------------------- */ // set/get current working directory. 設定/取得目前工作目錄。 function working_directory(change_to_directory) { if (change_to_directory) WshShell.CurrentDirectory = change_to_directory; return WshShell.CurrentDirectory + path_separator; } _.working_directory = working_directory; /* return {Object} report .list files matched .succeed success items .failed failed items .log log text .undo undo data usage example: move_file() get file list array of current dir. move_file(0,0,'dir') get file list array of dir. move_file('*.*','*.jpg','dir') Error! Please use RegExp('.*\..*') or wildcard_to_RegExp('*.*') move_file(/file(\d+).jpg/,0,'dir') get file list array of dir/file(\d+).jpg move_file(f1,move_file.f.remove) delete f1 move_file('f1','f2') [f1]->[f2] move_file('f1','f2','.',move_file.f.copy|move_file.f.reverse) copy [./f2] to [./f1] move_file(/file(\d+).jpg/,/file ($1).jpg/,'dir') [dir/file(\d+).jpg]->[dir/file ($1).jpg] can't use fuzzy or reverse in this time prog example: function move_file_filter(fn){var n=fn.match(/0000(\d+)\(\d\)\.pdf/);if(!n)return true;n=n[1];if(n!=0&&n!=1&&n!=7&&n!=10&&n!=13&&n!=15&&n!=26&&n!=28)return true;try{n=fn.match(/(\d+)\(\d\)\.pdf/);FileSystemObject.MoveFile(n[1]+'('+(n[1]?vol-1:vol-2)+').pdf',n[1]+'.pdf');}catch(e){}return;} var vol=11,doMove=move_file(new RegExp('(\\d+)\\('+vol+'\\)\\.pdf'),'$1.pdf'); write_file('move.log','-'.repeat(60)+line_separator+doMove.log,open_format.TristateTrue,ForAppending); write_file('move.undo.'+vol+'.txt',doMove.undo,open_format.TristateTrue),write_file('move.undo.'+vol+'.bat',doMove.undo);//bat不能用open_format.TristateTrue alert('Done '+doMove.succeed+'/'+doMove.list.length); for Win98, turn lower case: move_file(/^[A-Z\d.]+$/,function($0){return '_mv_tmp_'+$0.toLowerCase();},'.',move_file.f.include_folder|move_file.f.include_subfolder); alert(move_file(/^_mv_tmp_/,'','.',move_file.f.include_folder|move_file.f.include_subfolder).log); for(var i=0,j,n,m;i<40;i++) if(!FSO.FileExists(n='0000'+(i>9?'':'0')+i+'.pdf'))for(j=0;j<25;j++) if(FSO.FileExists(m='0000'+(i>9?'':'0')+i+'('+j+').pdf')){try{FSO.MoveFile(m,n);}catch(e){}break;} TODO: move newer 把新檔移到目的地,舊檔移到 bak。 */ _// JSDT:_module_ . /** * move/rename files, ** use RegExp, but no global flag **<br /> * 可用 move_file_filter() 來排除不要的<br /> * 本函數可能暫時改變目前工作目錄! * @param {String} from from file * @param {String} to to file * @param {String} base_path base path * @param flag * @param {Function} filter 可用 filter() 來排除不要的 * @return {Object} report * @since 2004/4/12 17:25 * @requires path_separator,FSO,WshShell,line_separator,Enumerator * @_memberOf _module_ */ move_file = function move_file(from, to, base_path, flag, filter) { var _s = move_file.f ? move_file : _.move_file, _f = _s.f, // '.?': 一定會match default_from = new RegExp('.?'), t, CurrentDirectory, report = {}; //library_namespace.debug(typeof from + ',' + from.constructor); if (flag & _f.reverse) //flag-=_f.reverse, t = from, from = to, to = t; if (!from) from = default_from; else if (typeof from !== 'string' && (!library_namespace.is_RegExp(from) && !(from = '' + from))) from = default_from; report.list = [], report.succeed = report.failed = 0, report.undo = report.log = ''; if (!base_path) base_path = '.' + path_separator; else if (typeof get_folder === 'function') base_path = get_folder(base_path); if ((base_path = '' + base_path).slice( // -1, or try: base_path.length-path_separator.length -1) !== path_separator) base_path += path_separator; /* if (typeof FSO === 'undefined') FSO = new ActiveXObject("Scripting.FileSystemObject"); else if (typeof FSO !== 'object') throw new Error(1, 'FSO was already seted!'); */ try { dir = FSO.GetFolder(base_path); } catch (e) { throw new Error(e.number, 'move_file(): 基準路徑不存在\n' + e.description); } // TODO: 對from不存在與為folder之處裡: fuzzy if (flag & _f.include_subfolder) { CurrentDirectory = WshShell.CurrentDirectory; for ( var i = new Enumerator(dir.SubFolders); !i.atEnd(); i.moveNext()) _s(from, to, i.item(), flag); if (base_path) // 改變目前工作目錄 WshShell.CurrentDirectory = base_path; } // if(flag&_f.include_folder){} var i, f = new Enumerator(dir.Files), use_exact = typeof from === 'string', overwrite = flag & _f.overwrite, not_test = !(flag & _f.Test), func = flag & _f.copy ? 'copy' : to === _f.remove || flag & _f.remove && !to ? 'delete' : from !== default_from || to ? 'move' : 'list'; // if(func=='delete')to=_f.remove; // 反正不是用這個判別的 //library_namespace.debug('use_exact: ' + use_exact + '\nbase_path: ' + base_path + '\nfrom: ' + from); // BUG: 這樣順序會亂掉,使得 traverse (遍歷)不完全 for (; !f.atEnd(); f.moveNext()) if (i = f.item(), use_exact && i.Name === from || !use_exact && from.test(i.Name)) { report.list.push(i.Name); if (typeof filter === 'function' && !filter(i.Name)) continue; t = func === 'copy' || func === 'move' ? i.Name.replace(from, typeof to === 'object' ? to.source : to) : ''; if (t) try { report.log += func + ' [' + i.Name + ']' + (t ? ' to [' + t + '] ' : ''); var u = ''; t = (base_path === default_from ? base_path : '') + t; if (func === 'delete') { if (not_test) i.Delete(overwrite); } else if (!FSO.FileExists(t) || overwrite) { if (not_test) { if (overwrite && FSO.FileExists(t)) FSO.DeleteFile(t, true); if (func === 'copy') // Copy() 用的是 FileSystemObject.CopyFile or FileSystemObject.CopyFolder, 亦可用萬用字元(wildcard characters) i.Copy(t, overwrite); else i.Move(t); } u = 'move ' + t + ' ' + i.Name + line_separator; } else { report.log += ': target existing, '; throw 1; } report.log += 'succeed.' + line_separator, report.undo += u, report.succeed++; } catch (e) { report.log += 'failed.' + line_separator, report.failed++; } //library_namespace.debug(i.Name + ',' + t); } if (flag & _f.include_subfolder && CurrentDirectory) WshShell.CurrentDirectory = CurrentDirectory; report.log += line_separator + (not_test ? '' : '(test)') + func + ' [' + from + '] to [' + to + ']' + line_separator + (typeof gDate === 'function' ? gDate() + ' ' : '') + 'done ' + report.succeed + '/' + report.list.length + line_separator; return report; }; //var move_file.f; //set_Object_value('move_file.f','none=0,overwrite=1,fuzzy=2,reverse=4,include_folder=8,include_subfolder=16,Test=32,copy=64,remove=128','int'); _// JSDT:_module_ . /** * <a href="#.move_file">move_file</a> 的 flag enumeration * @constant * @_memberOf _module_ */ move_file.f = { /** * null flag * @_memberOf _module_ */ none : 0, /** * overwrite target * @_memberOf _module_ */ overwrite : 1, /** * If source don't exist but target exist, than reverse. * @deprecated TODO * @_memberOf _module_ */ fuzzy : 2, /** * reverse source and target * @_memberOf _module_ */ reverse : 4, /** * include folder * @_memberOf _module_ */ include_folder : 8, /** * include sub-folder * @_memberOf _module_ */ include_subfolder : 16, /** * Just do a test * @_memberOf _module_ */ Test : 32, /** * copy, instead of move the file * @_memberOf _module_ */ copy : 64, /** * 當 target 指定此 flag,或包含此 flag 而未指定 target 時,remove the source。 * @_memberOf _module_ */ remove : 128 }; _// JSDT:_module_ . /** * move file * @requires FSO,get_folder,get_file_name,initialization_WScript_Objects * @_memberOf _module_ */ move_1_file = function(from, to, dir, only_file_name, reverse) { if (!from || !to || from === to) return new Error(1, 'file name error.'); var e; dir = get_folder(dir); if (reverse) e = from, from = to, to = e; e = function(_i) { return FSO.FileExists(_i) ? _i : dir ? dir + (only_file_name ? library_namespace.get_file_name(_i) : _i) : null; }; try { //library_namespace.debug('move_1_file:\n' + dir + '\n\n' + e(from) + '\n→\n' + e(to)); FSO.MoveFile(e(from), e(to)); return; } catch (e) { e.message = 'move_1_file:\n' + from + '\n→\n' + to// +'\n\n'+e.message ; return e; } }; /* function mv(from,to,dir,only_filename,reverse){ var e,_f,_t; dir=get_folder(dir); if(reverse)e=from,from=to,to=e; _f=from; _t=to; to=0; e=function(_i){ return FSO.FileExists(_i)?_i:dir&&FSO.FileExists(_i=dir+(only_filename?library_namespace.get_file_name(_i):_i))?_i:0; }; try{ if(!(_f=e(_f)))to=1;else if(!(_t=e(_t)))to=2; else{ alert('mv():\n'+dir+'\n\n'+_f+'\n→\n'+_t); FSO.MoveFile(_f,_t); return; } }catch(e){return e;} return e||new Error(to,(to==1?'移動するファイルは存在しない':'移動先が既存した')+':\n'+_f+'\n→\n'+_t); } function mv(from,to,dir,only_filename,reverse){ var e,_f,_t; dir=get_folder(dir); if(reverse)e=from,from=to,to=e; _f=from,_t=to,to=e=0; try{ if(!FSO.FileExists(_f)&&(!dir||!FSO.FileExists(_f=dir+(only_filename?library_namespace.get_file_name(_f):_f))))to=1; else if(FSO.FileExists(_t)&&(!dir||FSO.FileExists(_t=dir+(only_filename?library_namespace.get_file_name(_t):_t))))to=2; else{ alert('mv():\n'+dir+'\n'+_f+'\n→\n'+_t); //FSO.MoveFile(_f,_t); return; } }catch(e){} return e||new Error(to,(to==1?'移動するファイルは存在しない':'移動先が既存した')+':\n'+_f+'\n→\n'+_t); } */ /* 下面一行調到檔案頭 var get_file_details_items,get_file_details_get_object=-62.262; */ _// JSDT:_module_ . /** * get file details (readonly) * @example * get_file_details('path'); * get_file_details('file/folder name',parentDir); * get_file_details('path',get_file_details_get_object); * @see <a href="http://msdn.microsoft.com/en-US/library/bb787870%28VS.85%29.aspx" accessdate="2009/11/29 22:52" title="GetDetailsOf Method (Folder)">GetDetailsOf Method (Folder)</a> * @_memberOf _module_ */ get_file_details = function(fileObj, parentDirObj) { var i, n, r; // WinShell=new ActiveXObject("Shell.Application"); if (typeof WinShell === 'undefined' || !fileObj) return; // deal with fileObj & parentDirObj if (parentDirObj === get_file_details_get_object) parentDirObj = 0, n = 1; // else n=''; if (!parentDirObj) { // fileObj is path if (typeof fileObj !== 'string') return; if (i = fileObj.lastIndexOf('/') + 1) parentDirObj = fileObj.slice(0, i - 1), fileObj = fileObj .slice(i); else return; } if (typeof parentDirObj === 'string') parentDirObj = WinShell.NameSpace(parentDirObj); if (typeof fileObj == 'string' && fileObj) fileObj = parentDirObj.ParseName(fileObj); if (n) // just get [(object)parentDirObj,(object)fileObj] return [ parentDirObj, fileObj ]; // get item name if (typeof get_file_details_items !== 'object') { get_file_details_items = []; for (i = 0, j; i < 99; i++) // scan cols if (n = WinShell.NameSpace(0).GetDetailsOf(null, i)) get_file_details_items[i] = n; } // main process //for(i=0,r=[];i<get_file_details_items.length;i++) r = []; for (i in get_file_details_items) { //if(get_file_details_items[i]) r[get_file_details_items[i]] = r[i] = parentDirObj .GetDetailsOf(fileObj, i); } return r; }; _// JSDT:_module_ . /** * FileSystemObject Object Attributes Property * @see * <a href="http://msdn.microsoft.com/en-US/library/5tx15443%28VS.85%29.aspx" accessdate="2010/1/9 8:11">Attributes Property</a> * @_memberOf _module_ * @since 2010/1/9 08:33:36 */ FSO_attributes = { /** * Default. No attributes are set. * @_memberOf _module_ */ none : 0, /** * Normal file. No attributes are set. * @_memberOf _module_ */ Normal : 0, /** * Read-only file. Attribute is read/write. * @_memberOf _module_ */ ReadOnly : 1, /** * Hidden file. Attribute is read/write. * @_memberOf _module_ */ Hidden : 2, /** * System file. Attribute is read/write. * @_memberOf _module_ */ System : 4, /** * Disk drive volume label. Attribute is read-only. * @_memberOf _module_ */ Volume : 8, /** * Folder or directory. Attribute is read-only. * @_memberOf _module_ */ Directory : 16, /** * File has changed since last backup. Attribute is read/write. * @_memberOf _module_ */ Archive : 32, /** * Link or shortcut. Attribute is read-only. * @_memberOf _module_ */ Alias : 1024, /** * Compressed file. Attribute is read-only. * @_memberOf _module_ */ Compressed : 2048 }; // reverse map _.FSO_attributes_reverse = []; (function() { for (var i in _.FSO_attributes) if (i !== 'none') _.FSO_attributes_reverse[_.FSO_attributes[i]] = i; }) /* TODO 未來:change_attributes(path,'-ReadOnly&-Hidden&-System') 下面調到檔案頭 set_Object_value('Attribute','Normal=0,none=0,ReadOnly=1,Hidden=2,System=4,Volume=8,Directory=16,Archive=32,Alias=64,Compressed=128','int'); set_Object_value('AttributeV','0=Normal,1=ReadOnly,2=Hidden,4=System,8=Volume,16=Directory,32=Archive,64=Alias,128=Compressed'); */ _// JSDT:_module_ . /** * 改變檔案之屬性。 * chmod @ UNIX * @param F file path * @param A attributes, 屬性. * @example * change_attributes(path,'-ReadOnly'); * @_memberOf _module_ */ change_attributes = function(F, A) { if (!F) return -1; if (typeof F === 'string') try { F = FSO.GetFile(F); } catch (e) { return -2; } var a; try { a = F.Attributes; } catch (e) { return -3; } if (typeof A === 'undefined') A = a; else if (A === '' || A === 'Archive') A = 32; else if (A === 'Normal') A = 0; else if (isNaN(A)) if (A.charAt(0) === 'x' || A.charAt(0) === '-') if (A = -_.FSO_attributes[A.substr(1)], A && a % (A << 2)) A = a + A; else A = a; else if (A = _.FSO_attributes[A], A && a % (A << 2) === 0) A = a + A; else A = a; else if (_.FSO_attributes_reverse[A]) if (a % (A << 2) === 0) A = a + A; else A = a; else if (_.FSO_attributes_reverse[-A]) if (a % (A << 2)) A = a + A; else A = a; if (a !== A) try { F.Attributes = A; } catch (e) { //popErr(e); library_namespace.error(e); // 70:防寫(沒有使用權限) return 70 === (e.number & 0xFFFF) ? -8 : -9; } return F.Attributes; }; _// JSDT:_module_ . /** * 開檔處理<br /> * 測試是否已開啟資料檔之測試與重新開啟資料檔 * @param FN file name * @param NOTexist if NOT need exist * @param IO_mode open I/O mode * @return * @requires FSO,WshShell,IO_mode * @_memberOf _module_ */ openDataTest = function(FN, NOTexist, IO_mode) { if (!FN) return 3; if (NOTexist && !FSO.FileExists(FN)) return 0; if (!IO_mode) IO_mode = _.IO_mode.ForAppending; while (true) try { var Fs = FSO.OpenTextFile(FN, ForAppending); Fs.Close(); break; } catch (e) { // 對執行時檔案已經開啟之處理 //if(typeof e==='object'&&e.number&&(e.number&0xFFFF)===70) if ((e.number & 0xFFFF) !== 70) { return pErr(e, 0, '開啟資料檔 [<green>' + FN + '<\/>] 時發生錯誤!'), 6 === alert( '開啟資料檔 [' + FN + ']時發生不明錯誤,\n 是否中止執行?', 0, ScriptName + ' 測試是否已開啟資料檔:發生不明錯誤!', 4 + 48) ? 1 : 0; } if (2 === WshShell.Popup( '★資料檔:\n\ ' + FN + '\n 無法寫入!\n\n可能原因與解決方法:\n ①資料檔已被開啟。執行程式前請勿以其他程式開啟資料檔!\n ②資料檔被設成唯讀,請取消唯讀屬性。', 0, ScriptName + ':資料檔開啟發生錯誤!', 5 + 48)) return 2; } return 0; }; _// JSDT:_module_ . /** * * @param {String}file_path * file path * @param {Number|open_format}format * open format, e.g., open_format.TristateUseDefault.<br /> * default: auto-detecting * @param {Number|IO_mode}IO_mode * open I/O mode, e.g., IO_mode.ForAppending.<br /> * default: ForReading * @return */ open_template = function(file_path, format, IO_mode) { /** * file * @inner * @ignore */ var F, /** * file streams * @inner * @ignore */ Fs; if (!IO_mode) IO_mode = _.IO_mode.ForReading; if (!format) format = _.open_format.TristateUseDefault;// TristateTrue try { F = FSO.GetFile(file_path); //Fs=open_file(file_path,format,IO_mode); Fs = F.OpenAsTextStream(IO_mode, format); } catch (e) { // 指定的檔案不存在? pErr(e); // quit(); } return Fs; }; /** * * @param {String}file_path * file path * @param {Number|IO_mode}IO_mode * open I/O mode, e.g., IO_mode.ForAppending.<br /> * default: ForReading * @param {Number|open_format}format * open format, e.g., open_format.TristateUseDefault.<br /> * default: auto-detecting * @return */ //var openOut.f; // default format function openOut(file_path,IO_mode,format){ var OUT,OUTs,_f=openOut.f; if(!IO_mode)IO_mode=_.IO_mode.ForWriting; if(!format)format=_f==='string'&&_f?_f:_.open_format.TristateUseDefault; try{ OUT=FSO.GetFile(file_path); } catch(e){try{ //指定的檔案不存在 var tmp=FSO.CreateTextFile(file_path,true); tmp.Close(); OUT=FSO.GetFile(file_path); }catch(e){pErr(e);}} try{OUTs=OUT.OpenAsTextStream(IO_mode,format);}catch(e){pErr(e);} return OUTs; } // create link // 2015/9/3 // link source (target), link file path // https://msdn.microsoft.com/en-us/library/xsy6k3ys.aspx function create_shortcut(from, to, options) { if (!/\\.(lnk|url)$/i.test(to)) to += '.lnk'; var WshShortcut = WshShell.CreateShortcut(to); if (library_namespace.is_Object(options)) Object.assign(WshShortcut, options); WshShortcut.TargetPath = from; WshShortcut.Save(); return WshShortcut; } _.create_shortcut = create_shortcut; /* 轉換捷徑, 傳回shortcut的Object. true path http://msdn2.microsoft.com/en-US/library/xk6kst2k.aspx http://yuriken.hp.infoseek.co.jp/index3.html */ var p; //parse_shortcut[generateCode.dLK]='initialization_WScript_Objects';//,parseINI function parse_shortcut(path,rtPath){ if(typeof path!=='string')path=''; else if(/\.(lnk|url)$/i.test(path)){ var sc=WshShell.CreateShortcut(path),p=sc.TargetPath,_i; // 檔名有可能是不被容許的字元(不一定總是有'?'),這時只有.url以文字儲存還讀得到。 if(/*(''+sc).indexOf('?')!=-1*/!p&&/\.url$/i.test(path)&&typeof parseINI==='function'){ p=parseINI(path,0,1); sc={_emu:p}; sc.TargetPath=(p=p.InternetShortcut).URL; for(_i in p)sc[_i]=p[_i]; /* URL File Format (.url) http://www.cyanwerks.com/file-format-url.html [DEFAULT] BASEURL=http://so.7walker.net/guide.php [DOC#n(#n#n#n…)] [DOC#4#5] BASEURL=http://www.someaddress.com/frame2.html [DOC_adjustiframe] BASEURL=http://so.7walker.net/guide.php ORIGURL=http://so.7walker.net/guide.php [InternetShortcut] URL=http://so.7walker.net/guide.php Modified=50A8FD7702D1C60106 WorkingDirectory=C:\WINDOWS\ ShowCommand= // 規定Internet Explorer啟動後窗口的初始狀態:7表示最小化,3表示最大化;如果沒有ShowCommand這一項的話則表示正常大小。 IconIndex=1 // IconFile和IconIndex用來為Internet快捷方式指定圖標 IconFile=C:\WINDOWS\SYSTEM\url.dll Hotkey=1601 Hotkey: 下面加起來: Fn 單獨 || (Fn || base) 擇一 + additional 擇2~3 base: 0=0x30(ASCII) 9=0x39(ASCII) A=0x41(ASCII) Z=0x5a(ASCII) ;=0xba = , - . / `=0xc0 [=0xdb \ ] '=0xde Fn: F1=0x70 .. F12=0x7b additional: Shift=0x100 Ctrl=0x200 Alt=0x400 */ p=p.URL; } if(!rtPath)return sc; path=/^file:/i.test(p)?p.replace(/^[^:]+:\/+/,'').replace(/[\/]/g,'\\'):p; // /\.url$/i.test(path)?'':p; } return rtPath?path:null; }; //filepath=OpenFileDialog(); 基於安全,IE無法指定初始值或型態 //OpenFileDialog[generateCode.dLK]='IEA'; function OpenFileDialog() { var IE = new IEA, o; if (!IE.OK(1)) return null; // value="'+dP+'" useless IE.write('<input id="file" type="file" />'); o = IE.getE('file'); o.focus(); o.click(); o = o.value || null; // IE.setDialog(200,400).show(1); IE.quit(); return o; }; /** * 是否為檔案. * @param path file path * @param create create if not exist * @returns */ function is_file(path, create) { if (!path) return 0; /* if (typeof FSO == 'undefined') FSO = new ActiveXObject("Scripting.FileSystemObject"); */ if (FSO.FileExists(path)) return true; // doesn't exist path = library_namespace.get_file_name(path); if (create) try { create = FSO.CreateTextFile(path, true); create.Close(); } catch (e) { } return FSO.FileExists(path); }; _// JSDT:_module_ . is_file = is_file; /** * 是否為目錄 * @param path file path * @param create create if not exist * @returns 0:not folder, 1:absolute, 2:relative path */ function is_folder(path, create) { if (!path) return 0; if (FSO.FolderExists(path = turnToPath(path))) return is_absolute_path(path) ? 1 : 2; if (create) try { FSO.CreateFolder(path); return is_absolute_path(path) ? 1 : 2; } catch (e) { } return 0; }; _// JSDT:_module_ . is_folder = is_folder; /** * get directory name of a path * @param folder_path * @param mode 0:path, 1:file name * @returns */ function get_folder(folder_path, mode) { if (typeof folder_path === 'object' && typeof folder_path.Path === 'string') if (typeof folder_path.IsRootFolder !== 'undefined') return folder_path.Path; else folder_path = folder_path.Path; if (typeof folder_path !== 'string') return ''; //else if(/^[a-z]$/i.test(folder_path))folder_path+=':\\'; // if(folder_path.slice(-1)!='\\')folder_path+='\\'; var i = folder_path.lastIndexOf('\\'); if (i === -1) i = folder_path.lastIndexOf('/'); return i === -1 ? folder_path : mode ? folder_path.substr(i + 1) : folder_path.slice(0, i + 1); }; /** * 取得下一個序號的檔名,如輸入pp\aa.txt將嘗試pp\aa.txt→pp\aa[pattern].txt * @param file_path file path * @param begin_serial begin serial * @param pattern 增添主檔名的模式,包含Ser的部分將被轉換為序號 * @returns */ function getNextSerialFN(file_path, begin_serial, pattern) { if (!file_path) return; if (isNaN(begin_serial)) if (!FSO.FileExists(file_path)) return file_path; else begin_serial = 0; var i = file_path.lastIndexOf('.'), base, ext, Ser = ':s:'; if (i == -1) base = file_path, ext = ''; else // FSO.GetBaseName(filespec);FSO.GetExtensionName(path);FSO.GetTempName(); base = file_path.slice(0, i), ext = file_path.substr(i); if (!pattern) pattern = '_' + Ser; i = pattern.indexOf(Ser); if (i == -1) base += pattern; else base += pattern.slice(0, i), ext = pattern.substr(i + Ser.length) + ext; for (i = begin_serial || 0; i < 999; i++) if (!FSO.FileExists(base + i + ext)) return base + i + ext; return; }; _// JSDT:_module_ . /** * 將以 adTypeBinary 讀到的 2 bytes 一組之 ADO Stream binary data 資料轉換成可使用之 data。 * * @example * <code> * // 較安全的讀檔: * var text = translate_ADO_Stream_binary_data(read_file(file_path, 'binary')); * write_file(file_path, text, 'ISO-8859-1'); * </code> * * @param binary_data * ADO Stream 來的 binary data * @param {Integer}[length] * 處理 length * @param {Integer}[type] * 是否為數字 * @returns {String|Number}轉換過之資料 * @see <a * href="http://www.hawk.34sp.com/stdpls/dwsh/charset_adodb.html">Hawk&apos;s * W3 Laboratory : Disposable WSH : 番外編:文字エンコーディングとADODB.Stream</a> * @_memberOf _module_ */ translate_ADO_Stream_binary_data = function translate_ADO_Stream_binary_data(binary_data, length, type) { var _s = translate_ADO_Stream_binary_data, i = 0, charArray, value, DOM = _s.XMLDOM, position, text; // initialization if (!DOM) try { // 要素名は何でも良い DOM = _s.XMLDOM = new_COM("Microsoft.XMLDOM").createElement('tmp'); DOM.dataType = 'bin.hex'; } catch (e) { return; } if (binary_data !== 0) // binary data DOM.nodeTypedValue = binary_data, text = DOM.text, position = 0; else position = _s.position, text = _s.text; if ((length |= 0) < 1 || length > text.length / 2) length = text.length / 2; if (type) { for (value = 0; i < length; i++) value = 0x100 * value + parseInt(text.substr(position, 2), 16), position += 2; _s.position = position; return value; } if (library_namespace.is_debug()) { if (!(length > 0) || length !== parseInt(length)) library_namespace.debug(position + ', ' + i + ' == 0 ~ length = ' + length + ', ' + text.slice(0, 8), 2); } // Error 5029 [RangeError] (facility code 10): 陣列長度必須是一有限的正整數 charArray = new Array(parseInt(length)); // 極慢!用 += 更慢。 for (; i < length; i++) try { if (library_namespace.is_debug(2)) { if (i % 100000 === 0) library_namespace.debug(i, 2); if (i === 40) library_namespace.debug(String.fromCharCode(parseInt(text .substr(position, 2), 16)) + '\n' + charArray.join(''), 2); } charArray.push(String.fromCharCode(parseInt(text .substr(position, 2), 16))), position += 2; if (false) charArray[i] = String.fromCharCode((t.charCodeAt(i << 1) << 8) + t.charCodeAt((i << 1) + 1)); } catch (e) { e.description = 'translate_ADO_Stream_binary_data: 輸入了錯誤的資料:\n' + e.description; throw e; } if (!binary_data) _s.position = position; return charArray.join(''); }; _// JSDT:_module_ . /** * 轉換以 adTypeBinary 讀到的資料 * @param data 以 adTypeBinary 讀到的資料 * @param pos position * @since 2007/9/19 20:58:26 * @_memberOf _module_ */ Ado_binary = function(data, pos) { this.newDOM(); if (typeof data === 'string') { if (!data || typeof library_namespace.get_file_path === 'function' && !(data = library_namespace.get_file_path(data))) return; this.newFS(data); this.setPos(pos || 0); } else this.setData(data, pos); }; _// JSDT:_module_ . /** * @_memberOf _module_ */ Ado_binary.prototype = { /** * 設定 data * * @param data binary data * @param pos * @return * @_memberOf _module_ */ setData : function(data, pos) { this.DOM.nodeTypedValue = data,// binary data this.bt = this.DOM.text;// binary text if (!this.AdoS) this.len = this.bt.length / 2; this.setPos(pos || 0); }, setPos : function(p) { if (!isNaN(p)) { if (p < 0) p = 0; else if (p > this.len) p = this.len; this.pos = p; } return this.pos; }, testLen : function(len) { if (!len || len < 0) len = this.len; if (this.pos + len > this.len) len = this.len - this.pos; return len; }, /** * read data * @private * @param len length * @return * @_memberOf _module_ */ readData : function(len) { this.AdoS.Position = this.pos; var _data = this.AdoS.Read(len); // 讀 binary data 用 'ISO-8859-1' 會 error encoding. this.setData(_data, this.AdoS.Position); }, read : function(len) { var charArray = new Array(len = this.testLen(len)), _i = 0; this.readData(len); for (; _i < len; _i++) { try { charArray.push(String.fromCharCode(parseInt(this.bt .substr(2 * _i, 2), 16))); // charArray[i]=String.fromCharCode((t.charCodeAt(i<<1)<<8)+t.charCodeAt((i<<1)+1)); } catch (e) { this.retErr(e); } } return charArray.join(''); }, readNum : function(len) { len = this.testLen(len); this.readData(len); var val = 0, _i = len; for (; _i > 0;) { try { val = 0x100 * val + parseInt(this.bt.substr(2 * (--_i), 2), 16); } catch (e) { this.retErr(e); } } return val; }, readHEX : function(len) { len = this.testLen(len); this.readData(len); return this.bt; }, retErr : function(e) { e.description = 'Ado_binary: 輸入了錯誤的資料:\n' + e.description; throw e; }, /** * @private * @return * @_memberOf _module_ */ newDOM : function() { this.DOM = null; //try{ // 要素名は何でも良い. this.DOM = new_COM("Microsoft.XMLDOM").createElement('tmp' + Math.random()); //}catch(e){return;} this.DOM.dataType = 'bin.hex'; }, /** * @private * @param {String}file_path * file path * @return * @_memberOf _module_ */ newFS : function(file_path) { if (file_path) this.file_path = file_path; else if (!(file_path = this.file_path)) return; this.AdoS = open_file(file_path, 'binary'); if (library_namespace.is_type(this.AdoS, 'Error')) { return this.AdoS; } this.len = this.AdoS.Size; }, /** * 實際上沒多大效用。實用解決法:少用 ADO_Stream.Write() * @return * @_memberOf _module_ */ renew : function() { this.bt = this.data = 0; this.newDOM(); if (this.AdoS && this.file_path) { this.pos = this.AdoS.Position; this.AdoS.Close(); this.AdoS = null; this.newFS(); } }, destory : function(e) { if (this.AdoS) this.AdoS.Close(); this.AdoS = this.pos = this.bt = this.data = 0; } }; // Ado_binary.prototype={ /* // 速度過慢,放棄。 //open_file.returnADO=true; function handle_binary(file_path,func,interval){ var t,fs=open_file(file_path,'binary',ForReading); if(library_namespace.is_type(fs, 'Error'))return; if(!interval)interval=1; //alert(fs.size) while(!fs.EOS) if(func(translate_ADO_Stream_binary_data(fs.Read(interval))))return; func(); fs.Close(); } */ /* 配合simple系列使用 http://thor.prohosting.com/~mktaka/html/utf8.html http://www.andrewu.co.uk/webtech/comment/?703 http://www.blueidea.com/bbs/NewsDetail.asp?id=1488978 http://www.blueidea.com/bbs/NewsDetail.asp?GroupName=WAP+%BC%BC%CA%F5%D7%A8%C0%B8&DaysPrune=5&lp=1&id=1524739 C# http://www.gotdotnet.com/team/clr/bcl/TechArticles/TechArticles/IOFAQ/FAQ.aspx http://www.sqlxml.org/faqs.aspx?faq=2 http://www.imasy.or.jp/~hir/hir/tech/js_tips.html ADODB.Stream 最大問題:不能append http://msdn2.microsoft.com/en-US/library/ms808792.aspx http://msdn.microsoft.com/library/en-US/ado270/htm/mdmscadoenumerations.asp http://study.99net.net/study/web/asp/1067048121.html http://www.6to23.com/s11/s11d5/20031222114950.htm http://blog.csdn.net/dfmz007/archive/2004/07/23/49373.aspx */ /* 搬到前面 set_Object_value('AdoEnums','adTypeBinary=1,adTypeText=2' // StreamTypeEnum +',adReadAll=-1,adReadLine=-2' // StreamReadEnum http://msdn2.microsoft.com/en-US/library/ms806462.aspx +',adSaveCreateNotExist=1,adSaveCreateOverWrite=2' // SaveOptionsEnum +',adCR=13,adCRLF=-1,adLF=10' // LineSeparatorsEnum ,'int'); */ /** * ADO Enumerated Constants. * @see * <a href="http://msdn.microsoft.com/en-us/library/ms807536" accessdate="2012/3/29 21:51">ADO Enumerated Constants</a> */ var AdoEnums = { adTypeBinary : 1, adTypeText : 2, adReadAll : -1, adReadLine : -2, adSaveCreateNotExist : 1, adSaveCreateOverWrite : 2, adCR : 13, adCRLF : -1, adLF : 10 }; /** * 簡易開檔函數。<br /> * 會先嘗試以 ADO Stream 開檔,不成時則嘗試 FSO。<br /> * 主要提供給 <a href="#read_file">read_file</a>, <a href="#write_file">write_file</a> * 使用。 * * @param {String}file_path * file path * @param {Number|open_format}format * open format, e.g., open_format.TristateUseDefault.<br /> * default: auto-detecting * @param {Number|IO_mode}IO_mode * open I/O mode, e.g., IO_mode.ForAppending.<br /> * default: ForReading * * @returns {Error} * @returns {ADO Stream} * @returns {FileSystemObject} * * @_memberOf _module_ * * @since * 2012/3/29 22:45:19 重寫 open_file, read_file, write_file. 行為有所改變,與之前版本不相容! * * @see <a * href="http://msdn.microsoft.com/en-us/library/windows/desktop/ms675032.aspx" * accessdate="2012/3/29 18:19" title="Stream Object (ADO)">ADO Stream</a>,<br /> * <a href="http://msdn.microsoft.com/en-us/library/6kxy1a51.aspx" * accessdate="2012/3/29 18:21" title="FileSystemObject">FSO</a> */ function open_file(file_path, format, IO_mode) { if (false) { if (!file_path || _.is_absolute_path && library_namespace.get_file_path && !_.is_absolute_path(file_path) && !(file_path = library_namespace.get_file_path(file_path))) return new Error('Unknown file!'); } if (!file_path && library_namespace.get_file_path) file_path = library_namespace.get_file_path(file_path); if (file_path && typeof format === 'undefined' && library_namespace.guess_encoding) format = library_namespace.guess_encoding(file_path); var file_stream, reset = function() { // 所有用完的 handle 皆應經過這樣的處理。 try { file_stream && file_stream.Close(); } catch (e) { // TODO: handle exception } file_stream = null; }; if (isNaN(format)) { try { // ASPの場合, Err.Number=-2147221005表不支援. file_stream = new_COM("ADODB.Stream"); } catch (e) { library_namespace.error(e); return e; } // read write // file_stream.Mode=3; if (format === 'binary') // 以二進位方式操作 file_stream.Type = AdoEnums.adTypeBinary; else { file_stream.Type = AdoEnums.adTypeText; try { //library_namespace.debug('Set Charset [' + format + '] [' + file_path + ']', 2); file_stream.Charset = format in open_file.OS_alias ? open_file.OS_alias[format] : format; } catch (e) { /** * UTF-8, unicode, Shift_JIS, Big5, GB 2312, ascii=ISO-8859-1, * _autodetect, _autodetect_all ..<br /> * * @see HKEY_CLASSES_ROOT\MIME\Database\Charset */ library_namespace.debug('Illegal file format to open: (' + typeof format + ') [' + format + ']', 1, 'open_file'); library_namespace.error(e); reset(); return e; } } if (IO_mode === _.IO_mode.ForAppending && !FSO.FileExists(file_path)) // 無此檔時改 writing。 IO_mode = _.IO_mode.ForWriting; if (false && IO_mode === _.IO_mode.ForWriting) // truncate file file_stream.SetEOS(); file_stream.Open(); // file_stream.Position = 0; // file_stream.LineSeparator = AdoEnums.adLF; if (file_path && FSO.FileExists(file_path)) try { // library_namespace.debug('Load [' + file_path + ']', 2); file_stream.LoadFromFile(file_path); } catch (e) { library_namespace.debug('ADO Stream error.', 1, 'open_file'); library_namespace.error(e); reset(); return e; } if (IO_mode === _.IO_mode.ForAppending) // 因為 appending,將指標設至檔尾。 file_stream.Position = file_stream.Size; // else: assert: file_stream.Position === 0 } else { if (!file_path) return new Error('No file path specified!'); // 使用某些防毒軟體(如諾頓 Norton)時,.OpenTextFile() 可能會被攔截,因而延宕。 try { if (IO_mode === _.IO_mode.ForAppending && !FSO.FileExists(file_path)) // 無此檔時改 writing. IO_mode = _.IO_mode.ForWriting; file_stream = FSO.OpenTextFile(file_path, IO_mode || _.IO_mode.ForReading, // writing 則自動 create. IO_mode === _.IO_mode.ForWriting, format === _.open_format.TristateTrue || format === _.open_format.TristateFalse ? format : _.open_format.TristateUseDefault); } catch (e) { library_namespace.error(e); reset(); return e; } } return file_stream; } // character encoding used in guess_encoding.mapping : character encoding name used in OS. // TODO: 與 guess_encoding.OS_alias 統合。 open_file.OS_alias = { 'GB 2312' : 'GB2312' }; /** * 讀取檔案。 * * @param {String}file_path * file path * @param {Number|open_format}format * open format, e.g., open_format.TristateUseDefault.<br /> * default: auto-detecting * @param {Number|IO_mode}IO_mode * open I/O mode, e.g., IO_mode.ForAppending.<br /> * default: ForReading * @param {Function}line_handle * TODO: do this function per line, or use [line_handle, maxsize] * * @return {String} 檔案內容 * @returns {Error} * * @_memberOf _module_ */ function read_file(file_path, format, IO_mode, line_handle) { var contents, file_stream = open_file(file_path, format, IO_mode || _.IO_mode.ForReading); if (library_namespace.is_type(file_stream, 'Error')) { return file_stream; } if (false) { // TODO if (Array.isArray(line_handle)) s = line_handle[1], line_handle = line_handle[0]; } try { //library_namespace.debug('is_ADO_Stream: ' + is_ADO_Stream(file_stream), 2); if (is_ADO_Stream(file_stream)) { //library_namespace.debug('Type [' + file_stream.Type + ']', 2); if (file_stream.Type === AdoEnums.adTypeBinary) { // 讀 binary data 用 'ISO-8859-1' 會 error encoding. contents = file_stream.Read(AdoEnums.adReadAll); // 此時 IO_mode === true 表示不將 binary data 轉換為 String! if (!IO_mode) contents = translate_ADO_Stream_binary_data(contents); } else if (line_handle) { while (!file_stream.EOS) line_handle(file_stream.ReadText(AdoEnums.adReadLine)); if (false) while (!file_stream.EOS) { for ( var t = '', i = 0; !file_stream.AtEndOfStream && (!t || i < s); i++) t += file_stream.ReadText(AdoEnums.adReadLine); contents += line_handle(t); } } else contents = file_stream.ReadText(AdoEnums.adReadAll); file_stream.Close(); } else { // FSO if (line_handle) { while (!file_stream.AtEndOfStream) line_handle(file_stream.ReadLine()); if (false) while (!file_stream.AtEndOfStream) { for (t = '', i = 0; !file_stream.AtEndOfStream && (!t || i < s); i++) t += file_stream.ReadLine(); contents += line_handle(t); } } else contents = file_stream.ReadAll(); file_stream.Close(); } } catch (e) { try { file_stream.Close(); } catch (e) { } file_stream = null; return e; } return contents; } /** * 將 contents 寫入 file。<br /> * WARNING: ADODB.Stream does not support appending! * * @param {String}file_path * file path * @param {String}contents * 內容. contents to write. * @param {Number|open_format}format * open format, e.g., open_format.TristateUseDefault.<br /> * default: auto-detecting * @param {Number|IO_mode}IO_mode * open I/O mode, e.g., IO_mode.ForAppending.<br /> * default: ForWriting * @param {Boolean}no_overwrite * DO NOT overwrite * * @return {Error}error message. * * @_memberOf _module_ */ function write_file(file_path, contents, format, IO_mode, no_overwrite) { // 以內容判斷 encoding. if (typeof format === 'undefined' && !is_file(file_path)) { format = /^[\x20-\x7e\t\r\n]*$/.test(contents) ? _.open_format.TristateUseDefault : _.open_format.TristateTrue; } var file_stream = open_file(file_path, format, IO_mode || _.IO_mode.ForWriting); if (library_namespace.is_type(file_stream, 'Error')) { return file_stream; } try { if (is_ADO_Stream(file_stream)) { if (file_stream.Type === AdoEnums.adTypeText) { if (typeof format === 'string' && format.toUpperCase() === 'ASCII' && /\.js(?:on)?$/i.test(file_path)) { contents = contents.replace(/[^\u0000-\u00ff]/g, function(character) { character = character.charCodeAt(0).toString(16); while (character.length % 4 !== 0) character = '0' + character; return '\\u' + character; }); } file_stream.WriteText(contents); } else { file_stream.Write(contents); } // 設定 end of the stream 後,將 truncate 之後的內容。 // http://msdn.microsoft.com/en-us/library/windows/desktop/ms676745.aspx library_namespace.debug('設定 end of the stream from: ' + file_stream.Position + '/' + file_stream.Size + ', EOS:' + file_stream.EOS, 2); //file_stream.Position = file_stream.Size; // .SetEOS() 不能傳入 arguments,只能直接將當前 .Position 作為 EOS。 file_stream.SetEOS(); // assert: file_stream.Position === file_stream.Size && file_stream.EOS === true library_namespace.debug('設定 end of the stream to: ' + file_stream.Position + '/' + file_stream.Size + ', EOS:' + file_stream.EOS, 3); library_namespace.debug('Writing ' + contents.length + ' characters / file: ' + file_stream.Size + ' bytes to (' + format + ') [<a href="' + file_path + '">' + file_path + '</a>]'); // .SaveToFile() 須在 .Write 之後! file_stream.SaveToFile(file_path, AdoEnums.adSaveCreateOverWrite); file_stream.Close(); } else { file_stream.Write(contents); file_stream.Close(); } } catch (e) { try { file_stream.Close(); } catch (e) { } file_stream = null; if (e.number & 0xFFFF === 5) // for FSO library_namespace.debug('contents 中有此 locale 無法相容的字元,例如在中文 Big5 中寫入日文假名。'); return e; } } _// JSDT:_module_ . AdoEnums = AdoEnums; _// JSDT:_module_ . open_file = open_file; _// JSDT:_module_ . read_file = read_file; _// JSDT:_module_ . write_file = write_file; // TODO: unfinished //simpleDealFile[generateCode.dLK]='guess_encoding,read_file,write_file'; _// JSDT:_module_ . simpleDealFile = function(inFN, func, outFN, format, IO_mode, N_O) { if (!inFN) return; if (!outFN) outFN = inFN; var e = library_namespace.guess_encoding(inFN), i = read_file(inFN, e), o = read_file( outFN, e), t = func(i, inFN); if (typeof t === 'string' && o !== t) return write_file(outFN, t, e, N_O); }; /* 將 ISO-8859-1 轉成UTF-8 To use: .. translated=turnBinStr(original); .. translated=turnBinStr(); // delete temp file */ turnBinStr.temp_file = 'turnBinStr.tmp'; // temp file name function turnBinStr(t, _enc) { if (typeof t !== 'undefined') { if (!turnBinStr.tmpF) turnBinStr.tmpF = library_namespace.get_file_path(turnBinStr.temp_file, 1); //t+=''; //if(t.replace(/[^\x00-\x7f]+/g,''))return t; //var _q=t.replace(/[^?]+/g,'').length,_t,_j=0; var error = write_file(turnBinStr.tmpF,''+t,'ISO-8859-1'); //alert(turnBinStr.tmpF+'\n'+error.description+'\n'+t+'\n'+read_file(turnBinStr.tmpF,'UTF-8')); return read_file(turnBinStr.tmpF,'UTF-8'); /* if(!_enc)_enc='UTF-8,Big5,Shift_JIS,EUC-JP,GB 2312'.split(','); else if(!Array.isArray(_enc))_enc=[_enc]; for(;_j<_enc.length;_j++) if((_t=read_file(turnBinStr.tmpF,_enc[_j])).replace(/[^?]+/g,'').length==_q) return _t;//'['+_enc[_j]+']'+ return t; */ } // 有時會出錯 try { FSO.DeleteFile(turnBinStr.tmpF); } catch (e) { } } //----------------------------------------------------------------------------------------------------------------------------------------------------------// /* in UNIX: iconv -l iconv -c -f UTF-16 -t BIG5-HKSCS function.js */ _// JSDT:_module_ . /** * 將編碼為fromCode之檔案fileName中所有不合編碼toCode之char以encodeFunction轉換 * @param fileName * @param toCode * @param fromCode * @param encodeFunction * @return * @_memberOf _module_ */ iconv_file = function(fileName, toCode, fromCode, encodeFunction) { return iconv(read_file(fileName, fromCode), toCode, encodeFunction); }; _// JSDT:_module_ . /* 將string text中所有不合編碼toCode之char以encodeFunction轉換 convert string encoding<br /> CeL.iconv('測試每個字元 abc あaいiうuえeおo','Big5') TODO: 一次寫入多 bytes */ iconv = function(text, toCode, encodeFunction) { if (!text) return ''; // alert('iconv: ['+toCode+']\n'+text.slice(0,200)); if (/utf-?(8|16([bl]e)?)/i.test(toCode)) // skip Unicode return HTMLToUnicode(text, 1); var ADO_Stream = open_file(0, toCode); if (library_namespace.is_type(ADO_Stream, 'Error')) { library_namespace.error('error occurred: ' + ADO_Stream.message); return text; } // ADO_Stream.Type=AdoEnums.adTypeText; if (!encodeFunction) encodeFunction = // typeof toHTML ==='function' ? totoHTML: function(t) { return '\\u' + t.charCodeAt(0); }; var charToSet, i = 0, t = ''; // 測試每個字元 for (; i < text.length; i++) try { charToSet = text.charAt(i); if (charToSet.charCodeAt(0) < 256) { // 對於 code 過小的,直接匯入以增加速度。 t += charToSet; continue; } ADO_Stream.Position = 0; ADO_Stream.WriteText(charToSet); ADO_Stream.Position = 0; t += charToSet === ADO_Stream.ReadText(AdoEnums.adReadAll) ? charToSet : encodeFunction(charToSet); } catch (e) { t += encodeFunction(charToSet); } try { ADO_Stream.Close(); } catch (e) { } ADO_Stream = null; return t; }; //--------------------------------------------------- /* var driverProperty,folderProperty,fileProperty; set_Object_value('driverProperty','AvailableSpace,DriveLetter,DriveType,FileSystem,FreeSpace,IsReady,Path,RootFolder,SerialNumber,ShareName,TotalSize,VolumeName',1,set_Object_valueFlag.array); set_Object_value('folderProperty','Attributes,DateCreated,DateLastAccessed,DateLastModified,Drive,Name,ParentFolder,Path,ShortName,ShortPath,Size,Type,Files,IsRootFolder,SubFolders',1,set_Object_valueFlag.array);//Files起為Folder property fileProperty=folderProperty.slice(0,12);//folderProperty.sort(); */ //var kkk='';_.traverse_file_system(function(fileItem,itemType){kkk+=(itemType==_.traverse_file_system.f.driver?fileItem.DriveLetter+':('+fileItem.VolumeName+')':fileItem.Name+(itemType==_.traverse_file_system.f.folder?path_separator:''))+'\n';},'I:\\Documents and Settings\\kanashimi\\My Documents\\kanashimi\\www\\cgi-bin\\program');write_file('tmp.txt',kkk,'unicode'); /* _.traverse_file_system(FS_function_array) 省略path會當作所有Drives _.traverse_file_system(FS_function_array,'c:') c:→c:\→sub dir of c:\ _.traverse_file_system(FS_function_array,'c:\\') c:\→sub dir of c:\ _.traverse_file_system(FS_function_array,'c:\\cc') c:\cc,cc為dir→sub dir of c:\cc\ _.traverse_file_system(FS_function_array,'c:\\cc\\') c:\cc\→sub dir of c:\cc\ _.traverse_file_system(FS_function_array,['c:\\cc\\','d:\\dd']) c:\cc\→sub dir of c:\cc\→d:\dd→sub dir of d:\dd _.traverse_file_system([,folderFunction],'.'); _.traverse_file_system([,folderFu