Get all files recursively in directories NodejS

前端 未结 10 1253
暖寄归人
暖寄归人 2020-12-14 07:15

I have a little problem with my function. I would like to get all files in many directories. Currently, I can retrieve the files in the file passed in parameters. I would li

相关标签:
10条回答
  • 2020-12-14 07:32

    I needed to so something similar, in an Electron app: get all subfolders in a given base folder, using TypeScript, and came up with this:

    import { readdirSync, statSync, existsSync } from "fs";
    import * as path from "path";
    
    // recursive synchronous "walk" through a folder structure, with the given base path
    getAllSubFolders = (baseFolder, folderList = []) => {
    
        let folders:string[] = readdirSync(baseFolder).filter(file => statSync(path.join(baseFolder, file)).isDirectory());
        folders.forEach(folder => {
            folderList.push(path.join(baseFolder,folder));
            this.getAllSubFolders(path.join(baseFolder,folder), folderList);
        });
    }
    
    0 讨论(0)
  • 2020-12-14 07:34

    You can use loop through all the files and directories of the root folder, if it's a directory, then get inside it and repeat the process. Consider the code below:

    const fs = require('fs');
    const path = require('path');
    
    const target = './'; // choose the directory to target
    var result = []
    var filePaths = []
    var tempFolder = []
    const targetPath = fs.readdirSync(target);
    
    
    
    
    function hit(mainPath = targetPath) {
    
      mainPath.forEach((file) => {
    
        let check = fs.statSync(file);
    
        if (!check.isDirectory()) {
          filePaths.push(file)
        }
        else {
          if (file[0] != '.') {
            tempFolder.push(file)
          }
        }
      });
    
      // get files from folder
      if (tempFolder.length > 0) {
        tempFolder.forEach((dir) => {
          getFiles(dir)
        })
      } 
       // filePaths contains path to every file
    
    }
    
    
    
    
    function getFiles(dir) {
    
      var paths = fs.readdirSync(dir);
      var files = [];
    
      paths.forEach(function (file) {
        var fullPath = dir + '/' + file;
        files.push(fullPath);
      });
    
      files.forEach((tempFile) => {
        let check = fs.statSync(tempFile);
    
        if (check.isDirectory()) {
          getFiles(tempFile)
        } else {
          filePaths.push(tempFile)
        }
      })
    }
    
    
    
    hit(); // main function
    
    0 讨论(0)
  • 2020-12-14 07:36

    Here's mine. Like all good answers it's hard to understand:

    const isDirectory = path => statSync(path).isDirectory();
    const getDirectories = path =>
        readdirSync(path).map(name => join(path, name)).filter(isDirectory);
    
    const isFile = path => statSync(path).isFile();  
    const getFiles = path =>
        readdirSync(path).map(name => join(path, name)).filter(isFile);
    
    const getFilesRecursively = (path) => {
        let dirs = getDirectories(path);
        let files = dirs
            .map(dir => getFilesRecursively(dir)) // go through each directory
            .reduce((a,b) => a.concat(b), []);    // map returns a 2d array (array of file arrays) so flatten
        return files.concat(getFiles(path));
    };
    
    0 讨论(0)
  • 2020-12-14 07:37

    I did mine with typescript works well fairly easy to understand

        import * as fs from 'fs';
        import * as path from 'path';
    
        export const getAllSubFolders = (
          baseFolder: string,
          folderList: string[] = []
        ) => {
          const folders: string[] = fs
            .readdirSync(baseFolder)
            .filter(file => fs.statSync(path.join(baseFolder, file)).isDirectory());
          folders.forEach(folder => {
            folderList.push(path.join(baseFolder, folder));
            getAllSubFolders(path.join(baseFolder, folder), folderList);
          });
          return folderList;
        };
        export const getFilesInFolder = (rootPath: string) => {
          return fs
            .readdirSync(rootPath)
            .filter(
              filePath => !fs.statSync(path.join(rootPath, filePath)).isDirectory()
            )
            .map(filePath => path.normalize(path.join(rootPath, filePath)));
        };
        export const getFilesRecursively = (rootPath: string) => {
          const subFolders: string[] = getAllSubFolders(rootPath);
          const allFiles: string[][] = subFolders.map(folder =>
            getFilesInFolder(folder)
          );
          return [].concat.apply([], allFiles);
        };
    
    0 讨论(0)
提交回复
热议问题