一个简单的Node.js http服务器,它通过调用POST /deploy
在给定目录中创建文件。写入文件后,我想使用console.log
列出该目录中的所有文件。
为了创建文件(POST /deploy
),我打电话给:
fs.writeFile(filename, content, 'utf8', callback(null, {'newFile': filename}));
回调写入HTTP响应并使用以下内容列出文件:
fs.readdir(some_directory, (err, files) => {
files.forEach(file => {
console.log(file);
// Do something with the file
}
}
回调中未列出新文件。只有在我再次调用deploy后,才会列出上一个文件。例如,如果我连续使用a
创建文件b
和/deploy
,则仅在创建a
且b
未创建b
时列出fs.readdir
列出直到我再打一次电话。
我假设在调用回调时文件没有关闭,以便以后只有fs.readdir
的调用才会在文件关闭后看到。
如何在文件正确关闭后调用回调函数,并且可以使用fd
列出?
阅读fs.close()
手册。它工作,但需要一个 DownloadManager mgr = (DownloadManager) this.getSystemService(Context.DOWNLOAD_SERVICE);
boolean isDownloading = false;
DownloadManager.Query query = new DownloadManager.Query();
query.setFilterByStatus(
DownloadManager.STATUS_PAUSED|
DownloadManager.STATUS_PENDING|
DownloadManager.STATUS_RUNNING|
DownloadManager.STATUS_SUCCESSFUL
);
Cursor cur = mgr.query(query);
int col = cur.getColumnIndex(
DownloadManager.COLUMN_LOCAL_FILENAME);
for(cur.moveToFirst(); !cur.isAfterLast(); cur.moveToNext()) {
isDownloading = isDownloading || ("local file path" == cur.getString(col));
}
cur.close();
if (!isDownloading) {
Uri source = Uri.parse(myWebsites[j]);
Uri dst_uri = Uri.parse("file:///mnt/sdcard/Signagee");
DownloadManager.Request request = new DownloadManager.Request(source);
request.setDestinationUri(dst_uri);
request.setNotificationVisibility(
DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED
);
request.allowScanningByMediaScanner();
long id = mgr.enqueue(request);
}
,而不是文件名,所以我必须打开文件只是为了关闭它,这似乎很麻烦:
fs.open(filename,' w',function(error,fd){
fs.write(fd,content,function(err,written,buffer){
fs.close(fd,callback(null,{' newFile':filename}));
});
});
在搜索SO
答案 0 :(得分:2)
我认为这是你的问题:
fs.writeFile(filename, content, 'utf8', callback(null, {'newFile': filename}));
在上面的代码中,您可以立即运行回调,而无需等待操作完成。只有当你对callback(null, {'newFile': filename})
的调用实际上返回一个函数来调用它作为回调时,它才会起作用,我怀疑它是否会这样做。
这可能有所帮助:
fs.writeFile(filename, content, 'utf8', () => callback(null, {'newFile': filename}));
因为这里将在写操作完成后调用callback()
。但这还不够,因为你需要处理错误:
fs.writeFile(filename, content, 'utf8', (err) => {
if (err) {
// handle possible errors
} else {
callback(null, {'newFile': filename});
}
});
e.g。如果您的callback
可以将错误视为您可以执行的第一个参数:
fs.writeFile(filename, content, 'utf8', (err) => {
if (err) {
callback(err);
} else {
callback(null, {'newFile': filename});
}
});
或提前退回,您可以避免else
:
fs.writeFile(filename, content, 'utf8', (err) => {
if (err) {
return callback(err);
}
callback(null, {'newFile': filename});
});