繁体   English   中英

错误:ENOTDIR:不是目录,scandir'src / app / test.html'

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM