所以我正在使用第三方项目,并且有以下代码块:
// 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
视为一个目录,任何想法都是为什么会这样?
答案 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
}
}