当前位置: 首页 > 面试题库 >

fs.createWriteStream是否不立即创建文件?

邓阳嘉
2023-03-14
问题内容

从http 函数进行了如下简单 下载 (为简化起见,省略了错误处理):

function download(url, tempFilepath, filepath, callback) {
    var tempFile = fs.createWriteStream(tempFilepath);
    http.request(url, function(res) {
        res.on('data', function(chunk) {
            tempFile.write(chunk);
        }).on('end', function() {
            tempFile.end();
            fs.renameSync(tempFile.path, filepath);
            return callback(filepath);
        })
    });
}

但是,由于我download()异步调用了数十次,因此很少有人报告错误,因为fs.renameSync抱怨无法在找到文件tempFile.path

Error: ENOENT, no such file or directory 'xxx'

我使用了相同的URL列表进行测试,但失败了大约30%。一次下载一个相同的URL列表。

测试了一下,我发现下面的代码

fs.createWriteStream('anypath');
console.log(fs.exist('anypath'));
console.log(fs.exist('anypath'));
console.log(fs.exist('anypath'));

并非总是打印true,但有时第一个答案打印false

我怀疑太多的异步fs.createWriteStream调用不能保证文件的创建。这是真的?有什么方法可以保证文件创建?


问题答案:

write在您从tempFile写入流中收到'open'事件之前,您不应该调用写入流。除非您看到该事件,否则该文件将不存在。

为了您的功能:

function download(url, tempFilepath, filepath, callback) {
    var tempFile = fs.createWriteStream(tempFilepath);
    tempFile.on('open', function(fd) {
        http.request(url, function(res) {
            res.on('data', function(chunk) {
                tempFile.write(chunk);
            }).on('end', function() {
                tempFile.end();
                fs.renameSync(tempFile.path, filepath);
                return callback(filepath);
            });
        });
    });
}

为了您的测试:

var ws = fs.createWriteStream('anypath');
ws.on('open', function(fd) {
    console.log(fs.existsSync('anypath'));
    console.log(fs.existsSync('anypath'));
    console.log(fs.existsSync('anypath'));
});


 类似资料:
  • 我从http函数下载了一个简单的函数,如下所示(简化时省略了错误处理): 然而,当我异步调用数十次时,它很少在在。 我使用相同的网址列表来测试它,它失败了大约30%的时间。当一个接一个地下载时,相同的网址列表起作用。 再测试一些,我发现下面的代码 并不总是打印,但有时第一个答案会打印。 我怀疑有太多的异步调用无法保证文件创建。这是真的吗?有什么方法可以保证创建文件吗?

  • 问题内容: 如果我这样做: 然后创建文件,并始终返回“文件存在”。是否可以不创建文件就检查文件是否存在? 编辑: 我忘了提到它处于for循环中。所以这是真实的东西: 问题答案: 实例化a时,您并没有在磁盘上创建任何东西,而只是构建了一个可以调用某些方法的对象,例如。 既好又便宜,不要试图避免这种实例化。 该实例只有两个字段: 这是构造函数: 如您所见,实例只是路径的封装。创建它以便进行调用是继续进

  • 问题内容: 我有一个使用pthread的C程序。 我希望新创建的线程在创建后立即运行。 这背后的原因是我的线程具有用于设置信号处理程序的初始化代码,并且在主线程发送一些信号之前,我必须确保处理程序已就绪。 我尝试过紧随其后的尝试,但没有成功。 我怀疑这会有所不同,但是我在x86_64上运行Linux 3.6。 谢谢 问题答案: 或者,您可以使用屏障,即调用pthread_barrier_wait(

  • 我正在尝试设置一个简单的RMI服务器,该服务器绑定到注册表,供客户端获取以进行所有进一步的通信。我正在使用下面的代码: 当在我的本地机器上测试时,这工作得非常好,我能够在(本地)客户机和服务器之间建立连接。上面的main方法不会退出,直到我手动终止它,这是预期的行为。我的本地机器(Win8)运行的是Java 1.7.0_17 64位。 现在,当我在带有OpenJDK(版本1.7.0_55 64位)

  • 我有这个使用HikariCP连接池的代码: 我通过发出命令“Show Processlist”来监控mysql中的连接,我看到在行之后创建了100个连接: 。。。正在运行。我肯定这不是命中注定的,对吧?它应该在稍后执行pooledDataSource时创建连接。getConnection()。 我做错了什么?为什么它会立即创建100个连接??

  • 问题内容: 我有一个从Docker集线器提取的Docker映像。 当我运行时,容器立即退出。 我无权访问Docker映像的源代码,包括Dockerfile。我所拥有的只是我从中获得的图像。 我需要调试/查看映像中的内容(例如查看和浏览映像的文件系统),而无需将其作为容器运行。 可能吗? 问题答案: 从所需的图像启动容器,如下所示: 即使未连接STDIN仍保持打开状态 分配一个伪tty 梅子退出后停