我通過重寫C#中的一些實用工具來了解Node.js,以瞭解它的趣味性。我發現了一些不是用Node.js編寫的好主意,或者我完全錯過了一個能使它工作的概念。如何在Node.js中找到具有特定數據的文件?
程序的目標:搜索文件的目錄,找到符合某些條件的數據的文件。這些文件是壓縮XML文件,目前我只是在尋找一個標籤。這是我試過(files
是文件名的數組):
while (files.length > 0) {
var currentPath = rootDir + "\\" + files.pop();
var fileContents = fs.readFileSync(currentPath);
zlib.gunzip(fileContents, function(err, buff) {
if (buff.toString().indexOf("position") !== -1) {
console.log("The file '%s' has an odometer reading.", currentPath);
return;
}
});
if (files.length % 1000 === 0) {
console.log("%d files remain...", files.length);
}
}
我很緊張,這個時候我寫的。從控制檯輸出中可以清楚看出,所有gunzip操作都是異步的,並決定等待while循環完成。這意味着當我最終得到一些輸出時,currentPath
沒有它讀取文件時的值,所以程序沒用。我沒有看到用zlip模塊解壓縮數據的同步方式。我沒有看到存儲上下文的方式(currentPath
會這樣做),因此回調具有正確的值。我最初嘗試使用流,將文件流傳輸到gunzip流,但是我遇到類似的問題,因爲我的回調在循環完成後發生,我失去了有用的上下文。
這是一個漫長的一天,我不知道如何構建這個。循環是一個同步的東西,我的異步的東西取決於它的狀態。那很不好。我錯過了什麼?如果這些文件沒有被壓縮,由於readFileSync()會很容易。