[Node.js] 學習筆記:使用 readdir() 尋訪目錄下所有檔案
Learnyounode 的第五課,是用 readdir() 以非同步方式取得目錄下的所有檔案~
簡單範例如下:
var fs = require("fs"); fs.readdir(process.argv[2], function(err, list) { console.log(list); });
如果想要遞迴列出所有子目錄下的東西,先用 fs.stat() 判斷一下是否為目錄,
再往下走就行了:
var fs = require("fs"); var path = require("path"); function visit_dir(dir) { // Print folder name console.log("\n[" + dir + "]"); fs.readdir(dir, function(err, files) { if (!err) { files.forEach(function(file) { // Print file name console.log(file); file_full_path = path.join(dir, file); // Get file stat fs.stat(file_full_path, function(err, stats) { console.log(file_full_path); if (!err && stats.isDirectory()) { visit_dir(file_full_path); } }); }); } }); } visit_dir(process.argv[2]);
不過上面的程式執行後,卻發現 file_full_path 有點怪怪的,
值都是最後一個檔案的名稱,在本例中是 webserver.js:
testuser@localhost ~ $ node visit_dir.js . [.] NodeSchool echo_server.js module_path.js read_file.js visit_dir.js webserver.js file_full_path=webserver.js [webserver.js] file_full_path=webserver.js file_full_path=webserver.js file_full_path=webserver.js file_full_path=webserver.js file_full_path=webserver.js
這是因為 file_full_path 的值在 forEach 迴圈中一直被修改,
最後就是保留最後一次的值了~
而 fs.stat() 的 callback function 在那之後才會被呼叫到,
因此拿到的都是固定的最後一次的值…
要解決這個問題,一個方法是使用 IIFE (Immediately Invoked Function Expression),
如 JavaScript Cookbook: Preserving variables inside async calls called in a loop,
修改後程式如下:
var fs = require("fs"); var path = require("path"); function visit_dir(dir) { fs.readdir(dir, function(err, files) { if (!err) { // Print folder name console.log("\n[" + dir + "]"); files.forEach(function(file) { // Print file name console.log(file); file_full_path = path.join(dir, file); (function(file_full_path) { // Get file stat fs.stat(file_full_path, function(err, stats) { console.log("file_full_path="+file_full_path); if (!err && stats.isDirectory()) { visit_dir(file_full_path); } }); })(file_full_path); }); } }); } visit_dir(process.argv[2]);
執行結果也就正常囉:
testuser@localhost ~ $ node visit_dir.js . [.] NodeSchool echo_server.js module_path.js read_file.js visit_dir.js webserver.js file_full_path=NodeSchool file_full_path=echo_server.js file_full_path=module_path.js file_full_path=read_file.js file_full_path=visit_dir.js file_full_path=webserver.js [NodeSchool] 01_hello_world.js 02_argv_sum.js 03_count_newline.js 04_count_newline_async.js 05_list_files_by_ext.js file_full_path=NodeSchool/01_hello_world.js file_full_path=NodeSchool/02_argv_sum.js file_full_path=NodeSchool/03_count_newline.js file_full_path=NodeSchool/04_count_newline_async.js file_full_path=NodeSchool/05_list_files_by_ext.js
(本頁面已被瀏覽過 3,280 次)
One thought on “[Node.js] 學習筆記:使用 readdir() 尋訪目錄下所有檔案”
你的目錄輸出,與檔案輸出順序會不同,上面結果應該是運氣好,所以排得很整齊…
版主回覆:(04/29/2015 09:49:33 AM)
感謝您的指正,我後來看程式的確會有這樣的問題,會再把它修正一下,謝謝~~