nodejs写文件时磁盘大小不够怎么办?
发布于 7 年前 作者 yuwanlin 5626 次浏览 来自 问答
fs.writeSync(fd, '\0', fileSize)

写个10g的文件,如果磁盘只有5g了怎么办…有什么办法能事先获取磁盘大小吗?

14 回复

你尽管写,写进去算我输。 言归正传,你可以试验下,他是会抛异常告诉你写入失败的,如果确定要写入前确认,那就用系统指令df下,具体可以参考child process,除此之外,还想说一句,你写一个10G的数据,还是同步方式,是要卡死这个js吗,直接写shell重定向不好吗?

@haozxuan 至于为什么要用同步,是因为在做断点续传的时候要确保这个文件存在。要将分段的文件写到该文件的不同部分。 fs.createStream(finalPath, { start:}所以必须同步啊。。

update2 我还真试了下,用这个函数,写10g,也是秒写(立刻写入)

10g文件秒写……入?

10g文件秒写……入?

@waitingsong 是的,不吹不黑,童叟无欺。你可以试试哈。 直接写磁盘。

var fd = fs.openSync(targetFile, 'w+');
fs.writeSync(fd, '\0', fileSize); 
fs.closeSync(fd);

可以看我问的这个问题 https://cnodejs.org/topic/5a052d80a57c17282e1205be#5a05323b88c853c52fd5681d @dislido老哥的答案

@nnliang 是的,不吹不黑,童叟无欺。你可以试试哈。 直接写磁盘。

var fd = fs.openSync(targetFile, 'w+');
fs.writeSync(fd, '\0', fileSize); 
fs.closeSync(fd);

可以看我问的这个问题 https://cnodejs.org/topic/5a052d80a57c17282e1205be#5a05323b88c853c52fd5681d @dislido老哥的答案

@yuwanlin 看没人提醒你,我还是忍不住多写一句,无论使用哪一种语言,最终进行实际IO的仍然是系统级别的读写,按照你的意思10G文件1s写入,你可以去查下SSD硬盘的最快读写速度,这远远超越了基本常识。另外你从那个大兄弟那边copy的那段,他只是去堆里申请了2G空间,根本没有赋值,你拿来贴出来就说写入10G耗时1s未免太离谱了吧。

大小不够会在创建文件时就抛异常的,直接捕获就行了 错误码ENOSPC

try{
 // ...写文件
}catch(e){
	if (e.code === 'ENOSPC'){
		// ...处理磁盘满的情况
	}
}

会留下一个空文件,记得删掉

@yuwanlin 首先这个不是秒写,只是占位……,另外写入前可以先查看剩余磁盘容量或者直接处理异常

@haozxuan 这个写10G在系统中并不是真的写了10G,原理是当你想在一个空文件10G的位置写一个字节的时候,系统会把磁盘的其中10G空间划出来给这个文件,没有真的进行10G的写入(实际的消耗就是你给文件写一个\0的消耗) (我怕真是我说错了还for循环了增删几十个20G文件,CPU内存硬盘一片风平浪静)

@haozxuan 额,我大兄弟后来更新了一次,copy来的是后面的那段–直接写磁盘的,不是前面的通过buffer分配的…大兄弟那里的fs.writeSync真的可以的。。我自己也试验过。

var fd = fs.openSync(targetFile, 'w+');
fs.writeSync(fd, '\0', fileSize); 
fs.closeSync(fd);

我大兄弟也来回答了,你也一样看看

@dislido 多谢大兄弟,我以为是写10g个\0

@zhhb 多谢啦 我看我大兄弟又回答了,才知道。我以为是写10g个\0。 囧。。引用上方我大兄弟的原话。

这个写10G在系统中并不是真的写了10G,原理是当你想在一个空文件10G的位置写一个字节的时候,系统会把磁盘的其中10G空间划出来给这个文件,没有真的进行10G的写入(实际的消耗就是你给文件写一个\0的消耗) (我怕真是我说错了还for循环了增删几十个20G文件,CPU内存硬盘一片风平浪静)

@yuwanlin 这样我就能理解了,我真的不能理解秒写10g到磁盘

回到顶部