fs.readdir是怎么用的
时间: 2024-02-28 20:57:13 浏览: 300
`fs.readdir` 是 Node.js 中用于读取指定目录下的文件和子目录的函数。它的基本语法如下:
```javascript
fs.readdir(path[, options], callback)
```
其中:
- `path`:字符串,表示要读取的目录的路径。
- `options`:可选参数,可以是一个对象或字符串。如果是字符串,则表示编码方式,如 `'utf8'`;如果是对象,则可以设置多个选项,如 `{encoding: 'utf8', withFileTypes: true}`。
- `callback`:回调函数,用于处理读取目录操作的结果。它有两个参数,第一个参数是错误对象(如果有错误),第二个参数是包含目录中所有文件和子目录的数组。
例如,以下代码可以读取当前目录下的所有文件和子目录:
```javascript
const fs = require('fs');
fs.readdir('.', (err, files) => {
if (err) {
console.error(err);
} else {
console.log(files);
}
});
```
在上面的例子中,`'.'` 表示当前目录,`files` 数组包含了当前目录下所有文件和子目录的名称。
相关问题
const server=require('koa-static') const Koa=require('koa'); const fs = require("fs"); const app=new Koa() //挂载静态资源文件 app.use(server(__dirname+'/img')) //挂载请求 app.use(async ctx=>{ //异步获取相册文件夹 const fsImgArr=new Promise((res,err)=>{ fs.readdir('./img',(er,data)=>{ console.log(data) res(data) err(er) }) }) ctx.body={ name:'相册', imgs:await fsImgArr } }) 优化这段代码
这段代码可以进行如下优化:
1. 将Promise对象的创建与执行合并,使用util.promisify()方法将fs.readdir()方法转化为Promise对象。
2. 使用try-catch语句处理异步操作错误。
3. 将获取相册文件夹的操作移到中间件外部,在启动应用时即可异步获取相册文件夹,避免每次请求时都进行异步操作。
优化后的代码如下:
```
const server = require('koa-static');
const Koa = require('koa');
const fs = require('fs');
const util = require('util');
const app = new Koa();
// 异步获取相册文件夹
const fsImgArr = util.promisify(fs.readdir)('./img').catch((err) => {
console.error(`Error while reading images folder: ${err}`);
});
// 挂载静态资源文件
app.use(server(__dirname + '/img'));
// 挂载请求
app.use(async (ctx) => {
try {
const imgs = await fsImgArr;
ctx.body = {
name: '相册',
imgs,
};
} catch (err) {
console.error(`Error while getting images: ${err}`);
ctx.status = 500;
ctx.body = 'Internal Server Error';
}
});
```
这样优化后,每次请求时无需再进行异步操作,可以提高应用的性能。
const fs = require("fs"); const http = require("http"); const {promisify} = require("util"); const path = require("path"); let server = http.createServer(async (req,res)=>{ let urlObj = new URL(req.url,"http://"+req.headers.host); let removeDir = require("./removedir") let {pathname}=urlObj; res.setHeader("Content-Type","text/html;charset=utf-8") if(pathname ==="/"){ let pathurl = "./";/* 当前目录 */ let showurl = urlObj.searchParams.get("showurl"); if(showurl){ pathurl = showurl; } /* 判断是否为文件 */ let stat = fs.statSync(pathurl); if (stat.isFile()) { // 是文件 let filedata = await promisify(fs.readFile)(pathurl); res.write(filedata); res.end(); } // 判断是否需要执行删除的逻辑 let delpath = urlObj.searchParams.get("delpath"); if (delpath) { // 有 delpath参数 ,那么证明需要删除逻辑; if (fs.existsSync(delpath)) { let stat = fs.statSync(delpath); if (stat.isFile()) { // 是文件 : fs.unlinkSync(delpath); } else { // 是目录 removeDir(delpath); } } } let resdata = await promisify(fs.readdir)(pathurl); let tablestr = "<table border=''><tr><th>文件名</th><th>创建时间</th><th>操作</th></tr>"; resdata.forEach(item=>{ let myurl = path.join(pathurl,item); let stat = fs.statSync(myurl); console.log(stat); tablestr += `<tr><td><a href="/?showurl=${myurl}">${item}</a></td><td>${stat.birthtime}</td><td><a href="/?delpath=${myurl}">删除</a></td></tr>` }) //console.log(tablestr,"????????????????????????????") tablestr += "</table>"; res.write(tablestr); res.end(); } } ) server.listen(8888);
这段代码是一个基于Node.js的简单的文件浏览器,它通过HTTP服务器提供文件目录列表和文件内容的访问,并且支持删除文件和目录的操作。代码中使用了Node.js内置的fs模块来操作文件系统,使用http模块创建HTTP服务器,使用promisify函数将fs模块的异步方法转换为Promise对象,方便使用async/await语法。具体实现步骤如下:
1. 引入Node.js内置模块和自定义模块(removedir)。
2. 创建HTTP服务器,在回调函数中处理请求,获取URL对象和pathname。
3. 判断pathname是否为根目录/,如果是,获取当前目录路径pathurl和showurl参数,并判断路径是否为文件,如果是,读取文件内容并返回给客户端。
4. 判断是否需要执行删除逻辑,如果有delpath参数,判断路径是否存在,如果是文件,直接删除,如果是目录,调用自定义模块removedir实现递归删除。
5. 使用fs模块的readdir方法读取目录内容,遍历目录下的文件和子目录,并获取它们的文件名、创建时间和操作链接。
6. 将遍历结果拼接成HTML表格字符串并返回给客户端。
7. 监听8888端口,启动HTTP服务器。
阅读全文