处理删除 NodeJS 中可能很忙的文件的正确方法是啥?

Posted

技术标签:

【中文标题】处理删除 NodeJS 中可能很忙的文件的正确方法是啥?【英文标题】:What's the correct way to handle removing a potentially busy file in NodeJS?处理删除 NodeJS 中可能很忙的文件的正确方法是什么? 【发布时间】:2019-10-15 05:19:08 【问题描述】:

我有一个 NodeJS 服务器来管理一些文件。它将监视来自外部进程的已知文件名,一旦收到,就读取它,然后将其删除。但是,有时在文件从以前的使用中“解锁”之前尝试读取/删除它,因此可能偶尔会失败。我想做的是尽快重试这个文件,或者在完成后立即重试,或者继续快速重试。

我宁愿尽可能避免长时间睡眠,因为这需要尽快处理,并且每一秒都很重要。

fs.watchFile(intput_json_file, interval: 10, function(current_stats, previous_stats) 

                var json_data = "";
                try 
                    var file_cont = fs.readFileSync(input_json_file); // < TODO: async this
                    json_data = JSON.parse(file_cont.toString());
                    fs.unlink(input_json_file);
                 catch (error) 
                    console.log("The JSON in the could not be parsed. File will continue to be watched.");
                    console.log(error);
                    return;
                

                // Else, this has loaded properly.
                fs.unwatchFile(input_json_file);

                // ... do other things with the file's data.




// set a timeout for the file watching, just in case
setTimeout(fs.unwatchFile, CLEANUP_TIMEOUT, input_json_file);

我希望“EBUSY:资源繁忙或锁定”偶尔会出现,但文件解锁时并不总是调用fs.watchFile

我想创建一个函数,然后以 1-10 毫秒的延迟调用它,如果失败也可以调用它自己,但这感觉像是一条通往... 咳嗽 堆栈溢出。

我还想避开同步方法,以便很好地扩展,但是对于 NodeJS 来说相对较新,所有回调都开始变成迷宫。

【问题讨论】:

你能改变创建文件的外部服务吗? 否则,你可以使用类似Node Js: Test to see if a file is locked for editing by another process的轮询方法 @HereticMonkey 我不想这样做,因为这会有点尴尬,但是可以。 @HereticMonkey SetInterval 如果快速完成并且只有在第一次读取抛出时才会非常有用。但是,这对服务器来说会有点忙吗?这段时间 Node 可能还有其他事情要做。 只要你保持你在间隔内做的事情的数量很小,我怀疑这会对服务器造成很大的负担,但你当然应该测试以确保这一点。 setInterval 允许在间隔之间运行其他代码。 【参考方案1】:

这个故事可能会结束,但您可以创建自己的完全控制的 fs。在这种情况下,其他程序会将数据直接写入您的程序。只需按字词 fusefuse-binding

搜索

【讨论】:

以上是关于处理删除 NodeJS 中可能很忙的文件的正确方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章

VS2015无法正常打开项目,显示正忙的解决方案

如果提高工作效率(转载)

当工作忙时咋办,同一个时间干同一个事

fs.writeFileSync 给出错误:未知,在 nodejs 中进行同步文件写入的正确方法

腾讯求职经历(后附大量面试题+面试心得+学习资料)详细

腾讯求职经历(后附大量面试题+面试心得+学习资料)详细