javascript中使用activexobject操作本地文件夾的方法

字號:


    在windows平臺上, js可以調(diào)用很多windows提供地activexobject,本文就使用js來實現(xiàn)文檔處理, 和使用js編寫activex做一個簡單介紹.
    代碼如下:
    <!doctype html public -//w3c//dtd html 4.01 transitional//en http://www.w3.org/tr/html4/loose.dtd>
    <html>
    <head>
    <title> new document </title>
    </head>
    <script type=text/javascript>
    function readfolder(){
    var filepath = d:\\test\\;
    var fso = new activexobject(scripting.filesystemobject); //加載控件
    var f = fso.getfolder(filepath);
    var underfiles = new enumerator(f.files); //文件夾下文件
    for (;!underfiles.atend();underfiles.movenext()){
    var fn = + underfiles.item();
    //alert(fn);
    var content = readfile(fn,fso);
    alert(content);
    }
    }
    function readfile(path,fso){
    var f1 = fso.getfile(path);
    var fh = fso.opentextfile(f1, 1/*reading*/);
    var content = '';
    while ( !fh.atendofstream ) {
    content += fh.readline();
    }
    fh.close()
    return content;
    }
    function writeexcel(){
    var excelapp = new activexobject(excel.application);
    var excelsheet = new activexobject(excel.sheet);
    excelsheet.application.visible = true;
    excelsheet.activesheet.cells(1,1).value = this is column a, row 1;
    excelsheet.saveas(d:\\test.xls);
    excelsheet.application.quit();
    }
    </script>
    <body>
    <input type=button value=遍歷文件夾 onclick=readfolder()>
    <input type=button value=寫excel onclick=writeexcel()>
    </body>
    </html>
    javascript中activexobject對象是啟用并返回 automation 對象地引用.使用方法:
    newobj = new activexobject( servername.typename[, location])
    activexobject 對象語法有這些部分:其中newobj是必選項.要賦值為 activexobject 地變量名.
    servername是必選項.提供該對象地應(yīng)用程序地名稱.
    typename是必選項.要創(chuàng)建地對象地類型或類.
    location是可選項.創(chuàng)建該對象地網(wǎng)絡(luò)服務(wù)器地名稱.
    切記:activex是微軟地東西,故而這玩意兒只有ie才支持!
    javascript中利用activexobject來創(chuàng)建filesystemobject操作文件
    一、功能實現(xiàn)核心:filesystemobject 對象
    要在javascript中實現(xiàn)文件操作功能,主要就是依靠filesystemobject對象.
    二、filesystemobject編程
    使用filesystemobject 對象進行編程很簡單,一般要經(jīng)過如下地步驟: 創(chuàng)建filesystemobject對象、應(yīng)用相關(guān)方法、訪問對象相關(guān)屬性 .
    (一)創(chuàng)建filesystemobject對象
    創(chuàng)建filesystemobject對象地代碼只要1行:
    var fso = new activexobject(scripting.filesystemobject);
    上述代碼執(zhí)行后,fso就成為一個filesystemobject對象實例.
    (二)應(yīng)用相關(guān)方法
    創(chuàng)建對象實例后,就可以使用對象地相關(guān)方法了.比如,使用createtextfile方法創(chuàng)建一個文本文件:
    var fso = new activexobject(scripting.filesystemobject);
    var f1 = fso.createtextfile(c:\\myjstest.txt,true);
    (三)訪問對象相關(guān)屬性
    要訪問對象地相關(guān)屬性,首先要建立指向?qū)ο蟮鼐浔?,這就要通過get系列方法實現(xiàn):getdrive負責(zé)獲取驅(qū)動器信息,getfolder負責(zé)獲取文件夾信息,getfile負責(zé)獲取文件信息.比如,指向下面地代碼后,f1就成為指向文件c:\test.txt地句柄:
    var fso = new activexobject(scripting.filesystemobject);
    var f1 = fso.getfile(c:\\myjstest.txt);
    然后,使用f1訪問對象地相關(guān)屬性.比如:
    代碼如下:
    var fso = new activexobject(scripting.filesystemobject);
    var f1 = fso.getfile(c:\\myjstest.txt);
    alert(file last modified: + f1.datelastmodified);
    執(zhí)行上面最后一句后,將顯示c:\myjstest.txt地最后修改日期屬性值.
    但有一點請注意:對于使用create方法建立地對象,就不必再使用get方法獲取對象句柄了,這時直接使用create方法建立地句柄名稱就可以:
    代碼如下:
    var fso = new activexobject(scripting.filesystemobject);
    var f1 = fso.createtextfile(c:\\myjstest.txt,true);
    alert(file last modified: + f1.datelastmodified);
    三、操作驅(qū)動器(drives)
    使用filesystemobject對象來編程操作驅(qū)動器(drives)和文件夾(folders)很容易,這就象在windows文件瀏覽器中對文件進行交互操作一樣,比如:拷貝、移動文件夾,獲取文件夾地屬性.
    (一)drives對象屬性
    drive對象負責(zé)收集系統(tǒng)中地物理或邏輯驅(qū)動器資源內(nèi)容,它具有如下屬性:
    l totalsize:以字節(jié)(byte)為單位計算地驅(qū)動器大小.
    l availablespace或freespace:以字節(jié)(byte)為單位計算地驅(qū)動器可用空間.
    l driveletter:驅(qū)動器字母.
    l drivetype:驅(qū)動器類型,取值為:removable(移動介質(zhì))、fixed(固定介質(zhì))、network(網(wǎng)絡(luò)資源)、cd-rom或者ram盤.
    l serialnumber:驅(qū)動器地系列碼.
    l filesystem:所在驅(qū)動器地文件系統(tǒng)類型,取值為fat、fat32和ntfs.
    l isready:驅(qū)動器是否可用.
    l sharename:共享名稱.
    l volumename:卷標(biāo)名稱.
    l path和rootfolder:驅(qū)動器地路徑或者根目錄名稱.
    (二)drive對象操作例程
    下面地例程顯示驅(qū)動器c地卷標(biāo)、總?cè)萘亢涂捎每臻g等信息:
    代碼如下:
    var fso, drv, s =;
    fso = new activexobject(scripting.filesystemobject);
    drv = fso.getdrive(fso.getdrivename(c:\\));
    s += drive c: + – ;
    s += drv.volumename + \n;
    s += total space: + drv.totalsize / 1024;
    s += kb + \n;
    s += free space: + drv.freespace / 1024;
    s += kb + \n;
    alert(s);
    四、操作文件夾(folders)
    涉及到文件夾地操作包括創(chuàng)建、移動、刪除以及獲取相關(guān)屬性.
    folder對象操作例程 :
    下面地例程將練習(xí)獲取父文件夾名稱、創(chuàng)建文件夾、刪除文件夾、判斷是否為根目錄等操作:
    代碼如下:
    var fso, fldr, s = ;
    // 創(chuàng)建filesystemobject對象實例
    fso = new activexobject(scripting.filesystemobject);
    // 獲取drive 對象
    fldr = fso.getfolder(c:\\);
    // 顯示父目錄名稱
    alert(parent folder name is: + fldr + \n);
    // 顯示所在drive名稱
    alert(contained on drive + fldr.drive + \n);
    // 判斷是否為根目錄
    if (fldr.isrootfolder)
    alert(this is the root folder.);
    else
    alert(this folder isn't a root folder.);
    alert(\n\n);
    // 創(chuàng)建新文件夾
    fso.createfolder (c:\\bogus);
    alert(created folder c:\\bogus + \n);
    // 顯示文件夾基礎(chǔ)名稱,不包含路徑名
    alert(basename = + fso.getbasename(c:\\bogus) + \n);
    // 刪除創(chuàng)建地文件夾
    fso.deletefolder (c:\\bogus);
    alert(deleted folder c:\\bogus + \n);
    五、操作文件(files)
    對文件進行地操作要比以上介紹地驅(qū)動器(drive)和文件夾(folder)操作復(fù)雜些,基本上分為以下兩個類別:對文件地創(chuàng)建、拷貝、移動、刪除操作和對文件內(nèi)容地創(chuàng)建、添加、刪除和讀取操作.下面分別詳細介紹.
    (一)創(chuàng)建文件
    一共有3種方法可用于創(chuàng)建一個空文本文件,這種文件有時候也叫做文本流(text stream).
    第一種是使用createtextfile方法.代碼如下:
    代碼如下:
    var fso, f1;
    fso = new activexobject(scripting.filesystemobject);
    f1 = fso.createtextfile(c:\\testfile.txt, true);
    第二種是使用opentextfile方法,并添加上forwriting屬性,forwriting地值為2.代碼如下:
    代碼如下:
    var fso, ts;
    var forwriting= 2;
    fso = new activexobject(scripting.filesystemobject);
    ts = fso.opentextfile(c:\\test.txt, forwriting, true);
    第三種是使用openastextstream方法,同樣要設(shè)置好forwriting屬性.
    代碼如下:
    var fso, f1, ts;
    var forwriting = 2;
    fso = new activexobject(scripting.filesystemobject);
    fso.createtextfile (c:\\test1.txt);
    f1 = fso.getfile(c:\\test1.txt);
    ts = f1.openastextstream(forwriting, true);
    (二)添加數(shù)據(jù)到文件
    當(dāng)文件被創(chuàng)建后,一般要按照打開文件->填寫數(shù)據(jù)->關(guān)閉文件地步驟實現(xiàn)添加數(shù)據(jù)到文件地目地.
    打開文件可使用filesystemobject對象地opentextfile方法,或者使用file對象地openastextstream方法.
    填寫數(shù)據(jù)要使用到textstream對象地write、writeline或者writeblanklines方法.在同是實現(xiàn)寫入數(shù)據(jù)地功能下,這3者地區(qū)別在于:write方法不在寫入數(shù)據(jù)末尾添加新?lián)Q行符,writeline方法要在最后添加一個新?lián)Q行符,而writeblanklines則增加一個或者多個空行.
    關(guān)閉文件可使用textstream對象地close方法.
    (三)創(chuàng)建文件及添加數(shù)據(jù)例程
    下面地代碼將創(chuàng)建文件、添加數(shù)據(jù)、關(guān)閉文件幾個步驟結(jié)合起來進行應(yīng)用:
    代碼如下:
    var fso, tf;
    fso = new activexobject(scripting.filesystemobject);
    // 創(chuàng)建新文件
    tf = fso.createtextfile(c:\\testfile.txt, true);
    // 填寫數(shù)據(jù),并增加換行符
    tf.writeline(testing 1, 2, 3.) ;
    // 增加3個空行
    tf.writeblanklines(3) ;
    // 填寫一行,不帶換行符
    tf.write (this is a test.);
    // 關(guān)閉文件
    tf.close();
    (四)讀取文件內(nèi)容
    從文本文件中讀取數(shù)據(jù)要使用textstream對象地read、readline或readall 方法.read方法用于讀取文件中指定數(shù)量地字符;readline方法讀取一整行,但不包括換行符;readall方法則讀取文本文件地整個內(nèi)容.讀取地內(nèi)容存放于字符串變量中,用于顯示、分析.在使用read或readline方法讀取文件內(nèi)容時,如果要跳過一些部分,就要用到skip或skipline方法.
    下面地代碼演示打開文件、填寫數(shù)據(jù),然后讀取數(shù)據(jù):
    代碼如下:
    var fso, f1, ts, s;
    var forreading = 1;
    fso = new activexobject(scripting.filesystemobject);
    // 創(chuàng)建文件
    f1 = fso.createtextfile(c:\\testfile.txt, true);
    // 填寫一行數(shù)據(jù)
    f1.writeline(hello world);
    f1.writeblanklines(1);
    // 關(guān)閉文件
    f1.close();
    // 打開文件
    ts = fso.opentextfile(c:\\testfile.txt, forreading);
    // 讀取文件一行內(nèi)容到字符串
    s = ts.readline();
    // 顯示字符串信息
    alert(file contents = ‘ + s + ‘);
    // 關(guān)閉文件
    ts.close();
    (五)移動、拷貝和刪除文件
    對于以上三種文件操作,javascript各有兩種對應(yīng)地方法:file.move 或 filesystemobject.movefile用于移動文件;file.copy 或 filesystemobject.copyfile用于拷貝文件;file.delete 或 filesystemobject.deletefile用于刪除文件.
    下面地代碼演示在驅(qū)動器c地根目錄下創(chuàng)建一個文本文件,填寫一些內(nèi)容,然后將文件移動到\tmp目錄下,再在目錄\temp下面建立一個文件拷貝,最后刪除這兩個目錄地文件:
    代碼如下:
    var fso, f1, f2, s;
    fso = new activexobject(scripting.filesystemobject);
    f1 = fso.createtextfile(c:\\testfile.txt, true);
    // 寫一行
    f1.write(this is a test.);
    // 關(guān)閉文件
    f1.close();
    // 獲取c:\根目錄下地文件句柄
    f2 = fso.getfile(c:\\testfile.txt);
    // 移動文件到\tmp目錄下
    f2.move (c:\\tmp\\testfile.txt);
    // 拷貝文件到\temp目錄下
    f2.copy (c:\\temp\\testfile.txt);
    // 獲取文件句柄
    f2 = fso.getfile(c:\\tmp\\testfile.txt);
    f3 = fso.getfile(c:\\temp\\testfile.txt);
    // 刪除文件
    f2.delete();
    f3.delete();
    六、結(jié) 語
    通過以上對filesystemobject地各種對象、屬性和方法地介紹和示例,相信你已經(jīng)對如何使用javascript語言在頁面中操作驅(qū)動器、文件和文件夾有了清晰地認識.但是上述提及地例程都非常簡單,要全面、靈活地掌握javascript文件操作技術(shù),還需要大量地實踐練習(xí).而且還有一點提醒大家,由于涉及到在瀏覽器中進行文件讀寫這樣地高級操作,對于默認地瀏覽器安全級別而言,在代碼運行前都會有一個信息提示,這點請在實際環(huán)境中提示訪問者注意.