fs.writeSync(fd, '\0', fileSize)
写个10g的文件,如果磁盘只有5g了怎么办…有什么办法能事先获取磁盘大小吗?
你尽管写,写进去算我输。 言归正传,你可以试验下,他是会抛异常告诉你写入失败的,如果确定要写入前确认,那就用系统指令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到磁盘