Javascript Dir walking获取各种文件的abs路径数组

Javascript Dir walking获取各种文件的abs路径数组,javascript,node.js,node-modules,Javascript,Node.js,Node Modules,目标:递归利用NodeJ获取目录中所有文件的绝对路径列表 信息:作为一名python开发人员,我通常使用python包,这些包以独立于平台的方式处理这个问题。我的老板想要一些javascript代码来处理这个目标。。。作为一名JS开发人员,我之前的想法是“哦,这很简单。让我们查找节点,因为我从来没有机会用它弄脏我的手。”但我似乎错了 我在节点中没有看到任何与Dir-Walking相关的内容,也没有看到我可以一起破解来创建这样一个东西的方法 我在看“子进程”、“控制台”、“文件系统”、“操作系统”

目标:递归利用NodeJ获取目录中所有文件的绝对路径列表

信息:作为一名python开发人员,我通常使用python包,这些包以独立于平台的方式处理这个问题。我的老板想要一些javascript代码来处理这个目标。。。作为一名JS开发人员,我之前的想法是“哦,这很简单。让我们查找节点,因为我从来没有机会用它弄脏我的手。”但我似乎错了

我在节点中没有看到任何与Dir-Walking相关的内容,也没有看到我可以一起破解来创建这样一个东西的方法

我在看“子进程”、“控制台”、“文件系统”、“操作系统”、“路径”和“进程”。我没有看到任何类似于:

pushd .
cd $dir
for folder in $(ls);
do
  pushd .
  cd $folder
    //call again
  ls $(pwd)$flag >> $dir/files_matching.txt 
  popd
done;

 // or any platform independent means of recursively getting 
 // all files and their abs path which meet flag criterion, 
 //  such as "*.txt" || "_*found*"
我可以使用子进程来执行命令行项目,但是我需要根据使用该应用程序的操作系统创建一系列条件,我认为这可能是已经存在的

我不想重新发明轮子,但我想这已经完成了;我只是在基本模块中看不到它

我是否需要一个节点模块来完成这项工作,它位于基本模块之外


我尽量不必手动滚动一个基于条件操作系统的系统,以获得目录下所有文件(或因扩展名而产生的子集等)的abs路径的详尽列表。

因此,我在查看文件系统模块时注意到函数readDir

这在一定程度上起到了作用。我想这不是我想要的方法。我在寻找涉及列表和目录的内容,但没有阅读

无论如何,这里有一个方法来读取Dir

var fs = require('fs');

if (process.argv.length <= 2) {
    console.log("Usage: " + __filename + " path/to/directory");
    process.exit(-1);
}

var path = process.argv[2];

fs.readdir(path, function(err, items) {
    console.log(items);

    for (var i=0; i<items.length; i++) {
        console.log(items[i]);
    }
});
所以你可以把这一切结合在一起

var fs = require('fs')
function recurse_file_system(path, contains) {
  let files = fs.readdirSync(path);
  let dArr = [];
  let fArr = [];
  for (let i in files){
    let newPath = path + "/" + files[i]
    if (fs.statSync(newPath).isDirectory()){
      dArr.push(newPath)
    }else{
      if (filter(files[i], ".txt")){
         fArr.push(newPath)
      }
    }
  }
  if (arr.length == 0){
    return fArr;
  }else{
    for (let d in dArr){
      let rslt = recurse_file_system(dArr[d]);
      for (let i in rslt){
        fArr.push(rslt[i])
      }
    }
    return fArr;
  }
}
console.log("Files:")
console.log(recurse_file_system("/"))
现在如果你想扩展它,你需要做的就是添加一个过滤器,根据特定的标准限制返回的大小,比如文件名限制

function filter(filename, contains){
   let reg = new RegEx(contains)
   return reg.test(filename)
}

您可以将其添加到基本案例中,在那里您可以看到过滤器。。。或者您可以返回整个集合,并使用List方法filter对其进行过滤。

因此,我在查看文件系统模块时注意到函数readDir

这在一定程度上起到了作用。我想这不是我想要的方法。我在寻找涉及列表和目录的内容,但没有阅读

无论如何,这里有一个方法来读取Dir

var fs = require('fs');

if (process.argv.length <= 2) {
    console.log("Usage: " + __filename + " path/to/directory");
    process.exit(-1);
}

var path = process.argv[2];

fs.readdir(path, function(err, items) {
    console.log(items);

    for (var i=0; i<items.length; i++) {
        console.log(items[i]);
    }
});
所以你可以把这一切结合在一起

var fs = require('fs')
function recurse_file_system(path, contains) {
  let files = fs.readdirSync(path);
  let dArr = [];
  let fArr = [];
  for (let i in files){
    let newPath = path + "/" + files[i]
    if (fs.statSync(newPath).isDirectory()){
      dArr.push(newPath)
    }else{
      if (filter(files[i], ".txt")){
         fArr.push(newPath)
      }
    }
  }
  if (arr.length == 0){
    return fArr;
  }else{
    for (let d in dArr){
      let rslt = recurse_file_system(dArr[d]);
      for (let i in rslt){
        fArr.push(rslt[i])
      }
    }
    return fArr;
  }
}
console.log("Files:")
console.log(recurse_file_system("/"))
现在如果你想扩展它,你需要做的就是添加一个过滤器,根据特定的标准限制返回的大小,比如文件名限制

function filter(filename, contains){
   let reg = new RegEx(contains)
   return reg.test(filename)
}
您可以将其添加到基本案例中,在那里您可以看到过滤器。。。或者您可以返回整个集合,然后使用列表方法筛选。

我会这样做:

同步:

const fs=require(“fs”);
const{resolve}=require(“路径”);
const getFiles=dir=>{
常量堆栈=[resolve(dir)];
常量文件=[];
while(堆栈长度){
dir=stack.pop();
fs.readdirSync(dir.forEach)(项=>{
常量路径=解析(目录,项);
(fs.statSync(path).isDirectory()?stack:files.push(path);
});
}
归还文件;
};
console.log(getFiles(“.”);
异步:

const fs=require(“fs”);
const{resolve}=require(“路径”);
const pify=要求(“util”).promisify;
const readdir=pify(fs.readdir);
const stat=pify(fs.stat);
const getFiles=async dir=>{
const files=wait readdir(resolve(dir));
const filesP=files.map(异步文件=>{
const path=resolve(dir,file);
return(wait stat(path)).isDirectory()?getFiles(path):path;
});
//return(wait Promise.all(filesP)).flat();//节点~11中支持的flat
return[].concat(…(wait Promise.all(filesP));
};
getFiles(“.”)。然后(console.log);
异步演示

我会这样做:

同步:

const fs=require(“fs”);
const{resolve}=require(“路径”);
const getFiles=dir=>{
常量堆栈=[resolve(dir)];
常量文件=[];
while(堆栈长度){
dir=stack.pop();
fs.readdirSync(dir.forEach)(项=>{
常量路径=解析(目录,项);
(fs.statSync(path).isDirectory()?stack:files.push(path);
});
}
归还文件;
};
console.log(getFiles(“.”);
异步:

const fs=require(“fs”);
const{resolve}=require(“路径”);
const pify=要求(“util”).promisify;
const readdir=pify(fs.readdir);
const stat=pify(fs.stat);
const getFiles=async dir=>{
const files=wait readdir(resolve(dir));
const filesP=files.map(异步文件=>{
const path=resolve(dir,file);
return(wait stat(path)).isDirectory()?getFiles(path):path;
});
//return(wait Promise.all(filesP)).flat();//节点~11中支持的flat
return[].concat(…(wait Promise.all(filesP));
};
getFiles(“.”)。然后(console.log);

异步演示

我也更喜欢这个堆栈。这比我的干净多了。我不仅忘记了ES6代码以使事情更加精简。。。。但由于某种原因,我没有在应该使用堆栈的时候使用堆栈。。。我只有一个问题,对于sync,第一次迭代的dir是什么?看起来getFiles是一个获取目录的函数,但我看不到它被调用。我猜你只是把死刑漏掉了<代码>获取文件(“/”)例如?@fallereneaper是的,没错。我在代码中添加了一个执行示例(对于当前的dir
process.cwd()
),我也更喜欢堆栈。这比我的干净多了。我不仅忘记了ES6代码以使事情更加精简。。。。但由于某种原因,我没有在应该使用堆栈的时候使用堆栈。。。我只有一个问题,对于sync,第一次迭代的dir是什么?看起来getFiles是一个获取目录的函数,但我看不到它被调用。我猜你只是把死刑漏掉了<代码>获取文件(“/”)例如?@fallereneaper是的,没错。我在t中添加了一个执行示例(针对当前的dir
process.cwd()