我们如何创建一定大小的空文件?我有一个要求,我需要创建一个空文件(即文件填充零字节)。为了做到这一点,这是我目前采取的方法:
这是我目前使用的代码:
const createEmptyFileOfSize = (fileName, size) => {
return new Promise((resolve, reject) => {
try {
//First create an empty file.
fs.writeFile(fileName, Buffer.alloc(0), (error) => {
if (error) {
reject(error);
} else {
let sizeRemaining = size;
do {
const chunkSize = Math.min(sizeRemaining, buffer.kMaxLength);
const dataBuffer = Buffer.alloc(chunkSize);
try {
fs.appendFileSync(fileName, dataBuffer);
sizeRemaining -= chunkSize;
} catch (error) {
reject(error);
}
} while (sizeRemaining > 0);
resolve(true);
}
});
} catch (error) {
reject(error);
}
});
};
虽然这段代码有效但我能够创建非常大的文件(虽然创建一个空的大文件需要很长时间[创建10 GB文件大约需要5秒钟])但是我想知道是否有'实现这一目标的更好方法。
答案 0 :(得分:5)
无需在文件中写入任何内容。您所要做的就是打开文件进行书写('w'
表示"创建如果不存在,截断如果存在" )并写入至少一个字节到您需要的偏移量。如果偏移量大于文件的当前大小(如果存在),则扩展文件以适应新的偏移量。
您的代码应该像这样简单:
const fs = require('fs');
const createEmptyFileOfSize = (fileName, size) => {
return new Promise((resolve, reject) => {
fh = fs.openSync(fileName, 'w');
fs.writeSync(fh, 'ok', Math.max(0, size - 2));
fs.closeSync(fh);
resolve(true);
});
};
// Create a file of 1 GiB
createEmptyFileOfSize('./1.txt', 1024*1024*1024);
请注意,上面的代码不能处理错误。它是为了展示一个用例而编写的。您的真实生产代码应该处理错误(当然,拒绝承诺)。
详细了解fs.openSync()
,fs.writeSync()
和fs.closeSync()
。
Promise
应该异步处理;传递给构造函数的执行程序函数应尽快结束,使Promise
处于pending
状态。稍后,当处理完成时,Promise
将使用传递给执行程序的resolve
或reject
回调来更改其状态。
完整的代码,错误处理和Promise
的正确创建可能是:
const fs = require('fs');
const createEmptyFileOfSize = (fileName, size) => {
return new Promise((resolve, reject) => {
// Check size
if (size < 0) {
reject("Error: a negative size doesn't make any sense")
return;
}
// Will do the processing asynchronously
setTimeout(() => {
try {
// Open the file for writing; 'w' creates the file
// (if it doesn't exist) or truncates it (if it exists)
fd = fs.openSync(fileName, 'w');
if (size > 0) {
// Write one byte (with code 0) at the desired offset
// This forces the expanding of the file and fills the gap
// with characters with code 0
fs.writeSync(fd, Buffer.alloc(1), 0, 1, size - 1);
}
// Close the file to commit the changes to the file system
fs.closeSync(fd);
// Promise fulfilled
resolve(true);
} catch (error) {
// Promise rejected
reject(error);
}
// Create the file after the processing of the current JavaScript event loop
}, 0)
});
};