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

时间:2018-03-22 16:00:30

标签: node.js

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

  1. 我创建一个零字节大小的空文件。
  2. 接下来,我继续将零字节缓冲区(一次最多2 GB)附加到该文件,直到达到所需的大小。
  3. 这是我目前使用的代码:

    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秒钟])但是我想知道是否有'实现这一目标的更好方法。

1 个答案:

答案 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将使用传递给执行程序的resolvereject回调来更改其状态。

完整的代码,错误处理和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)
  });
};