Node.js 节点JS-I Can';t同步使用FS.Stat
我有一个节点js函数。它检查所有文件夹中的特定文件,并将每个文件的上次写入日期与请求日期进行比较。如果有匹配的文件夹,我想存储该文件夹的路径。实际上,我的函数可以工作,但它使日期控件异步。我尝试了fs.statSync,但它也不起作用。当我使用statSync时,我无法获得任何控制台日志输出Node.js 节点JS-I Can';t同步使用FS.Stat,node.js,fs,Node.js,Fs,我有一个节点js函数。它检查所有文件夹中的特定文件,并将每个文件的上次写入日期与请求日期进行比较。如果有匹配的文件夹,我想存储该文件夹的路径。实际上,我的函数可以工作,但它使日期控件异步。我尝试了fs.statSync,但它也不起作用。当我使用statSync时,我无法获得任何控制台日志输出 console.log('Collected Files - OutsideIF : ' + filesCollected); 它不会向我展示任何东西。甚至没有空的。我的最后一个控制台日志返回空 我在代码
console.log('Collected Files - OutsideIF : ' + filesCollected);
它不会向我展示任何东西。甚至没有空的。我的最后一个控制台日志返回空
我在代码中添加注释。以下是我的职能:
var scanFolders = function(){
// Listing all directories and files in path
fs.readdir(path,(err,files) => {
// Creating Variable For Record Result
var filesCollected = "";
// Loop for every directory and file
files.forEach(file=>{
// If current path is a directory
if (fs.lstatSync(path+'/'+file).isDirectory()){
// Check that directory for certain files
if((fs.existsSync(path+'/'+file+'/'+'LineChart.html')) && (fs.existsSync(path+'/'+file+'/'+'clip.mp4'))){
// Check last write time for clip mp4
fs.stat(path+'/'+file+'/clip.mp4', function (err, info){
var day = info.mtime.getDate();
var month = info.mtime.getMonth();
var year = info.mtime.getFullYear();
if (day < 10) {day = "0" + day;}
if (month < 10) {month = "0" + month;}
// Temp Date variable for compare them
var tempDate = day + '-' + month + '-' + year;
// I can see this console log it's working perfectly
console.log('file date : ' + tempDate + ' FileName : ' + file);
// Compare dates and if they are equal take that path to filesCollected Variable
if (tempDate == '24-01-2018'){
filesCollected += file + ';';
// If i check this code block with console log it's working too.
}
// Last loop from this "Collected Files - OutsideIF" log is actually what
// i want. I put this for control code flow. But it's returning after
// "Collected Files :" console log below. So i can't return that data
console.log('Collected Files - OutsideIF : ' + filesCollected);
});
//end
}
}
});
//It's return empty because this code executing first. So i guess fs.stat is async
console.log('Collected Files : ' + filesCollected);
})
};
var scanFolders=function(){
//列出路径中的所有目录和文件
fs.readdir(路径,(错误,文件)=>{
//为记录结果创建变量
var=”;
//循环每个目录和文件
files.forEach(文件=>{
//如果当前路径是目录
if(fs.lstatSync(路径+'/'+文件).isDirectory()){
//检查该目录中的某些文件
if((fs.existsSync(path++'/'+file++'/'+'LineChart.html'))和&(fs.existsSync(path++'/'+file++'/'+'clip.mp4')){
//检查剪辑mp4的上次写入时间
fs.stat(路径+'/'+文件+'/clip.mp4',函数(err,info){
var day=info.mtime.getDate();
var month=info.mtime.getMonth();
var year=info.mtime.getFullYear();
如果(天<10){day=“0”+天;}
如果(月<10){month=“0”+月;}
//用于比较它们的临时日期变量
var tempDate=日+'-'+月+'-'+年;
//我可以看到这个控制台日志它工作得很好
log('文件日期:'+tempDate+'文件名:'+file);
//比较日期,如果它们相等,则选择该路径作为变量
如果(临时日期='24-01-2018'){
filescolected+=文件+';';
//如果我用控制台日志检查这个代码块,它也会工作。
}
//这个“收集的文件-OutsideIF”日志的最后一个循环实际上是什么
//我想。我把它放在控制代码流中。但它在之后返回
//“收集的文件:”控制台日志如下。所以我不能返回数据
log('collectedfiles-OutsideIF:'+filescolected);
});
//结束
}
}
});
//它的返回为空,因为这段代码首先执行。所以我猜fs.stat是异步的
log('收集的文件:'+收集的文件);
})
};
从转换为时,需要使用其返回值,而不是传入回调。例如
fs.stat(path, function (err, info){
...
} );
大约相当于:
try {
const info = fs.statSync(path);
...
} catch ( err ) {
}
*除了异步和同步之间的区别,
使用const意味着不能在try块中重新分配info
。当您从转换为时,需要使用其返回值,而不是传入回调。例如
fs.stat(path, function (err, info){
...
} );
大约相当于:
try {
const info = fs.statSync(path);
...
} catch ( err ) {
}
*除了异步和同步之间的区别,
使用const意味着不能在try块中重新分配
info
。当您切换到fs.statSync
时,您是否也切换到使用var info=fs.statSync(path+'/'+file+'/clip.mp4')代码>而不是回调?同步I/O函数通常不接受回调。@Paulpro我会按照您的建议更新我的代码,这样就可以了。我是NodeJS的新手。非常感谢你的提示!你可以把它写成答案。好的,我把我的评论转换成了答案。当你切换到fs.statSync
时,你是否也切换到使用var info=fs.statSync(path+'/'+file+'/clip.mp4')代码>而不是回调?同步I/O函数通常不接受回调。@Paulpro我会按照您的建议更新我的代码,这样就可以了。我是NodeJS的新手。非常感谢你的提示!你可以把它写成答案。好吧,我把我的评论变成了答案。