Nodejs fs |错误:ENOTDIR:不是目录

时间:2016-06-05 10:28:56

标签: node.js file directory filesystems

所以我正在使用第三方项目,并且有以下代码块:

// walk through /run and remove all filecontents, keeping 1 level directories.
var root = '/run';

if (fs.existsSync(root)) {
  fs.readdirSync(root).forEach(cleanFileOrDir);
}

其中cleanFileOrDir是:

function cleanFileOrDir(f) {
  var fPath = path.join(root, f);
  if (fs.statSync(fPath).isFile()) {
    // if its a file delete it right away
    rimraf.sync(fPath);
  } else {
    // remove its contents
    rimrafKidsSync(fPath);
  }
}

我收到以下错误:

fs.js:945
  return binding.readdir(pathModule._makeLong(path), options.encoding);
                 ^

Error: ENOTDIR: not a directory, scandir '/run/acpid.socket'
    at Error (native)
    at Object.fs.readdirSync (fs.js:945:18)
    at rimrafKidsSync (/home/otis/Developer/project/dockworker/lib/controllers/dockCleaner.js:27:6)
    at cleanFileOrDir (/home/otis/Developer/project/dockworker/lib/controllers/dockCleaner.js:22:5)
    at Array.forEach (native)
    at Object.<anonymous> (/home/otis/Developer/project/dockworker/lib/controllers/dockCleaner.js:8:24)
    at Module._compile (module.js:541:32)
    at Object.Module._extensions..js (module.js:550:10)
    at Module.load (module.js:458:32)
    at tryModuleLoad (module.js:417:12)

我的/run/目录的内容是:

acpid.socket   crond.pid          docker       irqbalance.pid  mlocate.daily.lock  pppconfig        snapd.socket  udev     wpa_supplicant
agetty.reload  crond.reboot       docker.pid   lightdm         mount               resolvconf       sudo          udisks2  xtables.lock
alsa           cups               docker.sock  lightdm.pid     network             rsyslogd.pid     systemd       user
avahi-daemon   dbus               initctl      lock            NetworkManager      sendsigs.omit.d  thermald      utmp
containerd     dhclient-wlo1.pid  initramfs    log             plymouth            shm              tmpfiles.d    uuidd

我认为这可能是Nodejs v6文件系统可能已经改变的问题?

更新我修改了cleanFileOrDir函数,如下所示:

function cleanFileOrDir(f) {
  var fPath = path.join(root, f);
  console.log(fPath);
  if (fs.statSync(fPath).isFile()) {
    // if its a file delete it right away
    console.log('Is file');
    rimraf.sync(fPath);
  } else {
    // remove its contents
    console.log('Is directory');
    rimrafKidsSync(fPath);
  }
}

我现在得到以下输出:

/run/NetworkManager
Is directory
/run/acpid.socket
Is directory
fs.js:945

所以简而言之就是将/run/acpid.socket视为一个目录,任何想法都是为什么会这样?

1 个答案:

答案 0 :(得分:1)

由于“aspid.socket” - 套接字,它不是常规文件,也不是目录。可用的tests列表:

stats.isFile()
stats.isDirectory()
stats.isBlockDevice()
stats.isCharacterDevice()
stats.isFIFO()
stats.isSocket()

所以你需要改变逻辑:

function cleanFileOrDir(f) {
  var fPath = path.join(root, f);
  var stat = fs.statSync(fPath);

  if (stat.isFile()) {
    // if its a file delete it right away
    rimraf.sync(fPath);
  } else 
  if (stat.isDirectory()){
    // remove its contents
    rimrafKidsSync(fPath);
  } else
  if (stat.isSocket()) {
    // We do something with the socket
  }

}