Un problema con readdir è che passa solo il nome file, senza il percorso completo, alla variabile dati nella funzione indice. Diciamo che stai chiamando lo script da C: \ main. I contenuti di C: \ main sono
C: \ principale
C: \ Main \ cartella1
C: \ main \ folder1 \ subDir1
Quando il tuo programma entra folder1
e legge subDir1
, proverà a chiamare readdir
con data[i] = 'subDir1'
. Ma poiché la directory di lavoro corrente non è cambiata, che è ancora C:\main
, readdir
aggiunge questo al suo argomento path, risultando in C:\main\subDir1
, che non esiste.
Per gestire questo, possiamo tenere traccia della directory che è stata inviata a readdir, che è asincrona. Ciò significa che la directory deve essere definita nella funzione di callback prima di essere invocata.
var fs = require('fs');
var path = require('path');
var files = [];
var folders = [];
indexDir(__dirname);
function indexDir(d) {fs.readdir(d, function (err,data){
for (i in data){
console.log(path.join(d, data[i]));
if(fs.statSync(path.join(d, data[i])).isDirectory()){
folders.push(path.resolve(path.join(d, data[i])));
indexDir(path.join(d, data[i]));
}
else{
files.push(path.resolve(path.join(d, data[i])));
}
}
})}
Se vogliamo vedere i risultati una volta che la directory è stata completamente attraversata, potrebbe essere più semplice usare readdirSync, poiché è sincrono e bloccherà fino a quando tutte le directory non saranno state visitate. Altrimenti, se vogliamo mantenere le cose asincrone, possiamo chiamare un'altra funzione quando tutto è fatto tenendo traccia del numero di chiamate asincrone.
var fs = require('fs');
var path = require('path');
var files = [];
var folders = [];
var calls = 0;
indexDir(__dirname);
function indexDir(d) {
calls++;
fs.readdir(d, function (err,data){
calls--;
for (i in data){
if(fs.statSync(path.join(d, data[i])).isDirectory()){
folders.push(path.resolve(path.join(d, data[i])));
indexDir(path.join(d, data[i]));
}
else{
files.push(path.resolve(path.join(d, data[i])));
}
}
if (calls == 0){
present();
}
})}
function present(){
for (i in files){
console.log(files[i]);
}
for (i in folders){
console.log(folders[i]);
}
}