2016-05-28 7 views
0

Cのすべてのフォルダのツリーを表示しようとしていますが、cのファイルやフォルダの中には管理者権限が必要なものもあり、fs.statはこれによりエラーを投げます。私は何とか最初にfs.accessで権利をチェックし、fs.statを続けるために管理者権限が必要ないかどうか確認したいと思います。私のすべてのファイルとフォルダは配列の中にあり、私はそれを反復処理しています。しかし、悲しいことに私はコールバックを働かせてそれを手に入れません。誰かがこれで私を助けることができますか?すべての小さな助けに感謝します。fs.statの前にfs.accessを呼び出す

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

あなたはそれがh上に構築するものがないときは何かを提案するためにARD ...問題のコードを投稿することを検討してください。 – andlrc

答えて

0

非同期呼び出しは常に問題です。 :(とにかく

、次の2つのオプション。

最初に使用するコールバック再帰関数

または

約束の方法を使用しています。(blurbird primiseをお勧めします)

のためのいくつかの変更を行いますres.sendとres.end(私はコンソールのためにそれをテストしました)

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

ありがとう、たくさん助けて! – holymio

関連する問題