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

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

// 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作为一个目录,任何想法都是为什么呢?

由于“aspid.socket” – 一个套接字,它不是一个普通的文件,它不是一个目录。 可用testing列表:

 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 } }