创建一个特定大小的空文件?

Gau*_*tri 2 node.js

我们如何创建一个特定大小的空文件?我有一个要求,我需要创建一个空文件(即文件填充零字节).为了做到这一点,这是我目前采取的方法:

  1. 我创建了一个零字节大小的空文件.
  2. 接下来,我继续将零字节缓冲区(一次最多2 GB)附加到该文件,直到达到所需的大小.

这是我目前使用的代码:

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秒钟])但是我想知道是否有更好的方法来完成这个.

axi*_*iac 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应该异步处理; 传递给构造函数的执行函数应该尽快结束,留Promisepending状态.稍后,当处理完成时,Promise将使用传递给执行程序的resolvereject回调来更改其状态.

完整的代码,错误处理和正确创建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)