[英]Error: ENOTDIR: not a directory, scandir error on interactionCreate
[英]Error: ENOTDIR: not a directory, scandir 'src/app/test.html'
我具有此递归功能,可以遍历目录树以获取所有文件。 不知道为什么运行脚本时fs.stat(path).isDirectory()有时在其他文件上失败。 当脚本多次运行时,结果不一致:-有时,当路径为目录时,fs.stat(path).isDirectory()返回false。 -其他情况下,当路径是文件时,fs.stat(path).isDirectory()返回true。 并且-有时脚本运行没有错误。
const filesInDir$ = Rx.Observable.bindNodeCallback(fs.readdir)
const statFile$ = Rx.Observable.bindNodeCallback(fs.stat)
const getFiles = (dir = '') => {
const file$ = filesInDir$(dir)
.flatMap(f$ => f$)
.filter(file => file.indexOf('.spec') < 0)
const isDir$ = file$
.flatMap(file => statFile$(`${dir}/${file}`))
.map(f2 => {return {isDir: f2.isDirectory(), timestamp:
f2.mtime.getTime(), size: f2.size}});
return file$
.zip(isDir$, (file, obj) => {
console.log('file', file, obj, dir)
return ({file, obj})
})
.map(f => {
if(f.obj.isDir || f.file.indexOf('.') < 0) {
console.log('***dir', dir, f.file, f.obj.isDir)
return getFiles(`${dir}/${f.file}`)
} else if(f.file.indexOf('.') >= 0) {
return Rx.Observable.of({dir: dir, name: f.file, timestamp: f.obj.timestamp, size: f.obj.size});
}
}).flatMap(fobj => fobj)
};
问题很可能是由于flatMap
无法保留调用顺序。 isDir$
的通知不一定按照与file$
的通知相对应的顺序发出; 它们将以可用的顺序出现。
使用concatMap
以确保顺序正确:
const isDir$ = file$
.concatMap(file => statFile$(`${dir}/${file}`))
.map(f2 => ({
isDir: f2.isDirectory(),
timestamp: f2.mtime.getTime(),
size: f2.size
}));
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.