在 node.js 中读取文件和读取目录

Posted

技术标签:

【中文标题】在 node.js 中读取文件和读取目录【英文标题】:read files and read directory in node.js 【发布时间】:2021-11-29 22:02:29 【问题描述】:

我想知道读取文件和读取目录函数——fs.readdir(path, callback) 和 fs.readFile(path, options, callback) 有类似的功能,没有回调。这里,我先读取所有文件给定目录,并遍历所有文件并将其内容上传到 S3 存储桶。 请参阅下面的工作代码。

const s3Upload = async (req, res) => 
  const directoryName = "MAXIS_GAMING/Daily/"
  var data = 
  let files = 
  await readFiles1(directoryName)
  
  
  const readFiles1 = async(dirname) => 
    let _files
    fs.readdir(dirname, (err, files) => 
      // On error, show it and return
      if(err) return console.error(err);
    
      // files is an array containing the names of all entries
      // in the directory, excluding '.' (the directory itself)
      // and '..' (the parent directory).
    
      // Display directory entries
      console.log(files.join(' '));
      files.forEach(function(filename)
        fs.readFile(dirname + filename, 'utf-8', function(err, content)
          if(err) 
           // onError(err);
           throw err
            return;
          
          console.log('cont..............................',content)
          console.log('filename', filename)
          //await 
          uploadFiles(filename, content)
          //onFileContent(filename, content);
        )
      )
  
    )
  
  
  
  const uploadFiles = async (fileName, fileContent) => 
    console.log('in uploadd..........')
    const GLOBAL_ACCESS_KEY_ID = 'AKIDAQWZX6B3XUBDIFHLPC5LYFTJF15XPIQ';
    const GLOBAL_SECRET_ACCESS_KEY = 'Sv4Fe4h4QgErG5XoZbgeC63oczkdW3bMQfC0jvyR8bPbJ9Y97k+'
    const GLOBAL_DEFAULT_REGION = 'ap-southeast-1';
    const S3_IMAGE_BUCKET ='max-stg-image/stage/reports'//"max-stg-image";
    const S3_IMAGE_PATH =  "stage";
      
    AWS.config.update(
          accessKeyId: GLOBAL_ACCESS_KEY_ID,
          secretAccessKey: GLOBAL_SECRET_ACCESS_KEY,
          region: GLOBAL_DEFAULT_REGION,
    );
      
    const s3 = new AWS.S3()
    const bucket = new AWS.S3()
    const params = 
        Bucket: S3_IMAGE_BUCKET,
        Key: fileName,
        Body: fileContent
    ;
    
    // Uploading files to the bucket
    s3.upload(params, function(err, data) 
          if (err) 
              throw err;
          
          console.log(`File uploaded successfully. $data.Location`);
    );
  

  app.get('/home/s3Upload', s3Upload)

【问题讨论】:

不确定您真正想要的是什么。有fs.readdirSync()fs.readFileSync(),但它们都不应该在服务器中使用(启动代码除外),因为它们会阻塞事件循环并破坏服务器的可伸缩性。还有 fs.promises.readdirfs.promises.readFile 仍然是异步的,但它们返回一个承诺而不是使用普通的回调。 另外,请不要在 http 服务器路由处理程序中的异步处理程序中写入 if (err) throw err; 。您需要编写真正的错误处理来发送错误响应,而不是异步抛出不会做任何有用的事情。 【参考方案1】:

你可以这样做:

import  readdir  from 'fs/promises';
//or with require

const readdir = require('fs/promises').readdir;

try 
  const files = await readdir(path);
  for (const file of files)
    console.log(file);
 catch (err) 
  console.error(err);


在Node.js中检查here所有FS提供的promise API。

【讨论】:

以上是关于在 node.js 中读取文件和读取目录的主要内容,如果未能解决你的问题,请参考以下文章

Node.js学习之路05——fs文件系统之文件的写入和读取

使用node.js按顺序读取目录内所有文件的内容

Node.js——fs模块(文件系统),创建删除目录(文件),读取写入文件流

在 node.js 中读取 csv 文件的内容

Node.js文件系统路径的操作函数

node.js如何将远程的文件下载到本地解压读取