我们如何创建一个特定大小的空文件?我有一个要求,我需要创建一个空文件(即文件填充零字节).为了做到这一点,这是我目前采取的方法:
这是我目前使用的代码:
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);
}
});
};
Run Code Online (Sandbox Code Playgroud)
虽然这段代码有效但我能够创建非常大的文件(虽然创建一个空的大文件需要很长时间[创建一个10 GB文件大约需要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);
Run Code Online (Sandbox Code Playgroud)
请注意,上面的代码不能处理错误.它是为了展示一个用例而编写的.您的真实生产代码应该处理错误(当然,拒绝承诺).
阅读更多关于fs.openSync(),fs.writeSync()和fs.closeSync().
A Promise应该异步处理; 传递给构造函数的执行函数应该尽快结束,留Promise在pending状态.稍后,当处理完成时,Promise将使用传递给执行程序的resolve或reject回调来更改其状态.
完整的代码,错误处理和正确创建a 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)
});
};
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
616 次 |
| 最近记录: |