2016-05-28 11 views
0

Ich versuche, einen Baum aller meiner Ordner auf C aufzulisten. Einige der Dateien und Ordner auf c erfordern Admin-Rechte und fs.stat gibt einen Fehler aus diesem Grund. Ich möchte irgendwie zuerst mit fs.access nach den Rechten gucken und ob keine Administratorrechte benötigt werden um mit fs.stat fortzufahren. Alle meine Dateien und Ordner sind in einem Array und ich wiederhole es. Aber leider bekomme ich es mit den Callbacks nicht zur Arbeit. Kann mir jemand dabei helfen? Ich schätze jede kleine Hilfe.Aufruf von fs.access vor fs.stat

fs.readdir(seeDir, function (err, files) { 
    if (err) { 
     throw err; 
    }; 
    var fileName = ''; 
    var path = ''; 
    var statCallback; 

    for (var i = 0; i < files.length; i++) { 
     fileName = files[i]; 
     path = util.format('%s%s', seeDir, fileName); 
     var isLast = (i === (files.length - 1)); 

     fs.access(path, fs.F_OK | fs.R_OK, function(err) { 
      if (err) { 
       console.log(err); 
      } else { 
       fs.stat(path, function (err, stats) { 
        console.log(path); 
        if (err) { 
         throw err; 
        }; 
        if (stats.isDirectory()) { 
         res.write(util.format(formatDirectory, path, fileName)); 
        } 
        if (isLast) { 
         res.end(stringFooter); 
        } 
       }); 
      } 
      }); 

    } 
}); 
+0

Sie wissen, dass es h ist ard, um etwas zu empfehlen, wenn es nichts zu bauen gibt ... Stellen Sie sich vor, den betreffenden Code zu veröffentlichen. – andlrc

Antwort

0

Async-Aufruf ist immer ein Problem. :(

wie auch immer, haben Sie zwei Möglichkeiten.

ersten Gebrauch Rückruf rekursive Funktion

oder

Verwendung Versprechen Weg.

machen einige Veränderungen (blurbird primise empfehlen) für res.send und res.end (Ich habe es für die Konsole getestet.)

var fs = require('fs'); 
var util = require('util'); 
var Promise = require("bluebird"); 

var formatDirectory = '%s%s'; 


// CallBack 
var getDir = function(seeDir) { 
    var files = []; 
    var rv = []; 
    var done = function() { 
     console.log(rv); 
    } 
    var getFile = function() { 
     if(files.length == 0) { return done(); } // files empty, recursive done. 
     var file = files.shift(); // pick first file 
     var path = util.format('%s%s', seeDir, file); 
     fs.access(path, fs.F_OK | fs.R_OK, function(err) { 
      if(err) { console.log(err); getFile(); } 
      else { 
       fs.stat(path, function(err, stats) { 
        if(err) { console.log(err); } 
        else if(stats.isDirectory()) { rv.push(path); } // push result 
        getFile(); // recursive call 
       }); 
      } 
     }); 
    } 
    fs.readdir(seeDir, function(err, data) { 
     if(err) { throw err; } 
     files = data; // initialize 
     getFile(); 
    }); 
} 

// Promise 
var getDirPromise = function(seeDir) { 
    fs.readdir(seeDir, function (err, files) { 
     if (err) { throw err; }; 
     Promise.reduce(files, function(total, file) { 
      return new Promise(function(resolve, reject) { 
       var path = util.format('%s%s', seeDir, file); 
       fs.access(path, fs.F_OK | fs.R_OK, function(err) { 
        if (err) { console.log(err); return resolve(total); } 
        else { 
         return fs.stat(path, function (err, stats) { 
          console.log(path); 
          if (err) { console.error(err); } 
          else if (stats.isDirectory()) { 
           console.log(util.format(formatDirectory, path, file)); 
           total.push(util.format(formatDirectory, path, file)); 
          } 
          resolve(total); 
         }); 
        } 
       }); 
      }); 
     }, []).then(function(result) { 
      console.log("done", result); 
     }); 
    }); 
} 
//getDir('C:/'); 
//getDirPromise('C:/'); 
+0

Vielen Dank, hat mir sehr geholfen! – holymio

Verwandte Themen