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

时间:2017-07-24 04:42:51

标签: javascript node.js rxjs

我有这个递归函数来遍历目录树以获取所有文件。不确定为什么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)
};

1 个答案:

答案 0 :(得分:0)

问题很可能是flatMap没有保留调用的顺序。来自isDir$的通知不一定按照与file$相对应的顺序发出;它们将按照它们可用的顺序出现。

使用concatMap确保订单正确无误:

const isDir$ = file$
  .concatMap(file => statFile$(`${dir}/${file}`))
  .map(f2 => ({
    isDir: f2.isDirectory(),
    timestamp: f2.mtime.getTime(),
    size: f2.size
  }));