我需要某种方式遍历子目录,但是它返回一个错误:ENOENT: no such file or directory, stat 'text3.txt'
这是我使用的文件:
main.js
files
|_file1.txt
|_file2.txt
dir
|_text3.txt
这是我的main.js:
fs = require('fs'), aes = require('aes256'),
key = 'abc';
enc = file => {
return aes.encrypt(key,file)
}
decr = encr => {
return aes.decrypt(key,encr)
}
clf = dir => {
files = fs.readdirSync(dir);
// Filter files
for(let i of files){
stat = fs.statSync(i)
if(stat.isFile()){
newFiles.push(i)
}
else dirs.push(i)
}
// Encrypt folders
for(let file of newFiles){
fl = fs.readFileSync(file).toString();
fs.writeFileSync(file,enc(fl));
}
}
clf('./')
for(let c of dirs) clf(c);
解密和加密函数使用aes256加密并返回字符串。然后clf函数检查文件是否不是文件夹,并将文件夹推入数组。然后我们加密主目录中的文件,但是子目录中什么也没有发生,而是返回错误:
ENOENT: no such file or directory, stat 'text3.txt'
但是text3.txt在目录中!那为什么我有一个错误呢?
答案 0 :(得分:1)
首先,声明您使用的每个变量。这是使用未声明变量的灾难的秘诀。在不首先使用let
或const
将每个变量声明为适当的作用域之前,我什至不会尝试使用这样的代码。
第二,当您执行fs.statSync(i)
时,此处的i
只是一个没有路径的普通文件名。如果您执行console.log(i)
,将会看到它只是一个文件名。因此,要引用正确的文件,必须将readdirSync(dir)
上的路径添加回它,然后将该完整路径传递到fs.statSync()
。
您会发现path.join()
是将路径与文件名结合起来的便捷方法。