node實現rar格式壓縮

来源:http://www.cnblogs.com/wengxuesong/archive/2016/05/24/5524400.html
-Advertisement-
Play Games

背景 由於公司的CMS系統里,只接受rar格式壓縮的文件,所以沒法直接使用nodejs里提供的zip壓縮組件。只能從winRar軟體入手了,但網上沒有多少這方面相關的東西,所以下麵也是自己嘗試著在做。 主要解決的幾個問題 rar軟體的位置獲取問題 通過node的命令行組件child_process, ...


背景

由於公司的CMS系統里,只接受rar格式壓縮的文件,所以沒法直接使用nodejs里提供的zip壓縮組件。只能從winRar軟體入手了,但網上沒有多少這方面相關的東西,所以下麵也是自己嘗試著在做。

主要解決的幾個問題

rar軟體的位置獲取問題

通過node的命令行組件child_process,運行註冊表查詢命令REG query ‘鍵值名’,可以查找出相關軟體的目錄,然後使用正則表達式對結果進行匹配,返回軟體目錄。命令如下:

var cp=require('child_process');

cp.exec("reg query HKEY_CLASSES_ROOT\\WinRAR\\shell\\open\\command /ve", function(e, stdout, stderr) {
                    if(!e){
                        var str = stdout.match(/\"([^\"]+)\"/)[0];
                        if(str){
                            console.log('已經找到winRar程式,詳細地址為:'+str);

                        }else{
                            console.log('沒有找到winRar程式,無法完成壓縮功能!');
                        }
                    }
});

通過上面的命令可以獲取到註冊表中winRar程式的絕對路徑,如果你安裝正確應該獲得下麵這個結果

image

環境變數設置問題

通過上面一步可以解決winRar軟體的路徑問題,但怎麼才能方便地調用rar命令呢?我的第一個想法就是設置環境變數。通過運行命令行命令set path=%path%;新目錄,node命令如下:

cp.exec("set path=%path%"+";c:\\", function(e, stdout, stderr) {
            if(!e){
                console.log("環境變數path添加;c:\\成功!")
            }
});

獲取結果如下

image

到這裡好像沒有問題。其實這裡存在一個問題,這個環境變數設置是臨時的,在命令行關閉時這個環境變數就消失了。

無法在下一次調用命令行時使用,所以到這裡來說,無法再進行下去了。

在調用的過程中,設置環境變數和運行命令是兩個步驟:

cp.exec("set path=%path%"+";c:\\", function(e, stdout, stderr) {
            if(!e){
                console.log("環境變數path添加;c:\\成功!");
                cp.exec('rar a -r f:/build/1.rar f:/xc/gulpfile.js',{encoding:'binary'},function(e,stin,stout){
                    console.log(e,stin,stout);
                });
            }
});

下麵的方法運行並不能得到正確的結果。

image

直接調用winRar程式

解決方法有兩種,一種是笨方法,讓每個使用者,手動去配置環境變數。第二種是直接在命令行使用完整的程式路徑調用。

第一種方法,是最後的一步,實在不行才用這個方法,手動畢竟不是程式員該乾的事。

第二種方法,測試可以使用,運行以下代碼,

cp.exec('"C:\\Program Files\\WinRAR\\WinRAR.exe" a -r f:/build/1.rar f:/xc/gulpfile.js',{encoding:'binary'});

將得到以下結果

imageimage

這裡需要註意的是當路徑中有空格的時候,可以把整個路徑用引號包起來,不然會導致命令行命令運行失敗。

但這裡必須忍受,下麵這個視窗。

image

一些擴展

1、在壓縮的過程中,會包含上級文件夾,如何去壓縮只包含文件不包含文件夾的,壓縮包形如下麵的圖示

image

2、對文件目錄包含的內容進行過濾,並對需要的文件及子文件夾進行壓縮,如文件目錄如下,我只想壓縮裡面的htm,txt文件。

image

可以通過node的fs組件,然後調用fs.readdirSync()方法,然後對得到的數組進行過濾。

需要註意的問題

1、程式運行路徑中有空格時,別忘記用引號把路徑包上,以及對符號進行轉義。

2、在調用rar壓縮文件時,當過濾掉的目錄中含有和當前目錄相同文件名的文件時,也會把子目錄對應的文件壓縮進來。

在文件結構如下

image

運行下麵的命令

cp.exec('"C:\\Program Files\\WinRAR\\WinRAR.exe" a -r f:/build/1.rar f:/xc/gulp.js',{encoding:'binary'});

雖然在本目錄下沒有對應的文件,但rar程式會自動,遍歷子文件夾,最後生成如下的壓縮包

image

因為這個組件文件夾里包含gulp.js文件。這會使上面的過濾出現問題,我還沒解決,還沒想到辦法。

總結

基本上面的功能都完成了,只是構建工具里的一小部分,完成對源文件合併,壓縮,md5後,添加的一個小功能。後面還會找一資料看一下,怎麼解決上面的問題。在這裡哪位大俠有解決辦法,可以評論或私信,非常感謝。

 

附錄一:winRar命令

配置完,winRar的環境變數,直接運行 rar,可以得到下麵這些個列表

使用示例:

rar a contact.rar contact.dat

如果contact.rar不存在將創建contact.rar文件;如果contact.rar壓縮包中已有contact.ext,將更新壓縮包中的contact.ext

rar a -r -v2000 -sfx vudroid2.rar vudroid2

遞歸壓縮vudroid2目錄下全部文件為 2M 大小分捲自解壓文件(自解壓文件就是壓縮文件中已經包含瞭解壓縮的工具,無需用戶自己安裝解壓縮工具) vudroid2.part1.sfx,vudroid2.part2.rar,vudroid2.part3.rar 等,將命令a換成命令m可將文件壓縮後刪除

rar x contact.rar

用絕對路徑來解壓,如果是rar x contact.rar ~/hehe/,前提是hehe文件夾要存在。就是解壓到當前路徑的hehe目錄下,還有一個是e參數,解釋是加壓到當前目錄下,在ubuntu 10.04我實驗過,rar e和rar x都可以用相對路徑和絕對路徑解壓,這一點我也不知道是為什麼

rar a -pzaba contact1.rar contact.dat

使用密碼 zaba 壓縮contact1.rar文件

附錄二:node的child_process組件

child_process.exec(command, [options], callback)   來源:《Node.js v4.2.4 手冊 & 文檔-child_process

  • command {String} 將要執行的命令,用空格分隔參數
  • options {Object}
    • cwd {String} 子進程的當前工作目錄
    • env {Object} 環境變數鍵值對
    • encoding {String} 編碼(預設為 'utf8')
    • shell {String} 運行命令的 shell(UNIX 上預設為 '/bin/sh',Windows 上預設為 'cmd.exe'。該 shell 在 UNIX 上應當接受 -c 開關,在 Windows 上應當接受 /s /c 開關。在 Windows 中,命令行解析應當相容 cmd.exe。)
    • timeout {Number} 超時(預設為 0)
    • maxBuffer {Number} 最大緩衝(預設為 200*1024)
    • killSignal {String} 結束信號(預設為 'SIGTERM')
  • callback {Function} 進程結束時回調並帶上輸出
    • error {Error}
    • stdout {Buffer}
    • stderr {Buffer}
  • 返回:ChildProcess 對象

在 shell 中執行一個命令並緩衝輸出。

child = exec('cat *.js bad_file | wc -l',
  function (error, stdout, stderr) {
    console.log('stdout: ' + stdout);
    console.log('stderr: ' + stderr);
    if (error !== null) {
      console.log('exec error: ' + error);
    }
});

回調參數為 (error, stdout, stderr)。當成功時,error 會是 null。當遇到錯誤時,error 會是一個Error 實例,並且 err.code 會是子進程的退出代碼,同時 err.signal 會被設置為結束進程的信號名。

第二個可選的參數用於指定一些選項,預設選項為:

{ encoding: 'utf8',
  timeout: 0,
  maxBuffer: 200*1024,
  killSignal: 'SIGTERM',
  cwd: null,
  env: null }

如果 timeout 大於 0,則當進程運行超過 timeout 毫秒後會被終止。子進程使用 killSignal 信號結束(預設為 'SIGTERM')。maxBuffer 指定了 stdout 或 stderr 所允許的最大數據量,如果超出這個值則子進程會被終止。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • Atitit.100% 多個子元素自適應佈局屬性 1.1. 原理1 1.2. Table佈局1 1.3. Css佈局1 1.4. 判斷amazui載入完畢2 1.1. 原理 每個子元素平均分配,但是有個min-width... min-width優先 演算法:首先算出平均值,然後與每一個帶min-wi ...
  • align-content 作用: 會設置自由盒內部各個項目在垂直方向排列方式。 條件:必須對父元素設置自由盒屬性display:flex;,並且設置排列方式為橫向排列flex-direction:row;並且設置換行,flex-wrap:wrap;這樣這個屬性的設置才會起作用。 設置對象: 這個屬 ...
  • Vue.js報錯Failed to resolve filter問題原因 金剛 vue Vue.js js javascript 之前使用vue.js寫分頁功能時,寫了一個過濾器,發現一個比較奇怪的錯誤。 console控制台調試的時候 提示錯誤消息: Failed to resolve filte ...
  • 1.前言 上一篇jQuery分析(2)中瞭解了jQuery庫的骨架實現原理,這就好比搖滾音樂,搖滾音樂不是某種音樂他就像一個音樂盒子,裡面包含了各種不同的搖滾風格(山地、朋克、鄉村、流行、硬搖、金屬、迷幻等)。那麼上一篇只是大致瞭解了jQuery的基本形狀,從這篇文章開始會深入jQuery庫的各種函 ...
  • 前言 React 的核心思想是:封裝組件,各個組件維護自己的狀態和 UI,當狀態變更,自動重新渲染整個組件。 最近前端界鬧的沸沸揚揚的技術當屬 了,加上項目需要等等原因,自己也決定花些時間來好好認識下這個東西。然後花時間自己寫了一個demo: , 你可以先 "點這裡去看react todo" rea ...
  • 動畫屬性 背景屬性 邊框(Border) 和 輪廓(Outline) 屬性 盒子(Box) 屬性 顏色(Color) 屬性 內邊距(Padding) 屬性 媒體頁面內容屬性 尺寸(Dimension) 屬性 彈性盒子模型(Flexible Box) 屬性 字體(Font) 屬性 內容生成屬性(Gen ...
  • 效果:http://hovertree.com/texiao/css3/24/效果圖:代碼如下: 轉自:http://hovertree.com/h/bjaf/css3xingxi.htm 特效彙總:http://www.cnblogs.com/roucheng/p/texiao.html ...
  • 二刷《高程》第八章BOM筆記整理。 如果要在Web中使用JavaScript,那麼BOM(瀏覽器對象模型)才是真正核心,BOM提供很多對象,用於訪問瀏覽器的功能,這些功能與任何網頁內容無關。 window對象 location對象 navigator對象 screen對象 history對象 win ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...