【发布时间】:2014-01-27 10:39:00
【问题描述】:
我有一个简单的节点脚本,它查找文件更改并使用 ssh 将文件复制到远程服务器。
fs.watch(filename,function(curr,prev){
//copy file to the remote server
});
但是,由于我正在观看的文件是通过ftp 上传的,并且对于我收到的每一块数据,文件都会更改并且回调会被触发。有没有办法仅在传输完整文件时才查找更改?
提前致谢。
【问题讨论】:
我有一个简单的节点脚本,它查找文件更改并使用 ssh 将文件复制到远程服务器。
fs.watch(filename,function(curr,prev){
//copy file to the remote server
});
但是,由于我正在观看的文件是通过ftp 上传的,并且对于我收到的每一块数据,文件都会更改并且回调会被触发。有没有办法仅在传输完整文件时才查找更改?
提前致谢。
【问题讨论】:
我知道这是一个老问题,但对于处于相同情况的其他人来说,现在有以下模块:
【讨论】:
对于 Linux,您可能可以使用 inotify binding module 和 IN_CLOSE_WRITE 标志。该事件将告诉您以前打开文件进行写入的进程现在何时关闭文件描述符。
【讨论】:
我在windows平台上遇到了同样的情况,结果是这样的:
try {
var nRetries = 10;
var retryTimeInterval = 500
var currentRetry = 0;
var pollFunction = function(){
try{
var rootFolder = path.dirname(require.main.filename);
var completePathToFile = path.resolve(rootFolder, filePath);
fs.readFileSync(path.resolve(rootFolder, filePath));
// do stuff with file here
}
catch(e){
if (currentRetry < nRetries) {
currentRetry += 1;
setTimeout(pollFunction, retryTimeInterval);
}
};
pollFunction();
文件在写入时必须被 ftp 服务器锁定(因此 fs.readFileSync 会抛出)。
不是很漂亮,但我没有找到其他方法。
【讨论】: