即使文件存在,readFileSync也不会返回任何数据

时间:2018-09-06 13:34:24

标签: node.js macos filesystems

tl; dr

readFileSync在读取〜24kb的文件后返回大小为零的结果。没有错误。

不是那么好; dr

首先,我以编程方式使用browserify来构建三个JS文件。该操作成功完成,文件位于我期望的位置,文件名符合我的期望,手动检查文件大小和内容均符合期望。

稍后在代码执行期间,我使用readFileSync读回这些文件,并将它们与其他文件连接起来以创建捆绑软件。问题是,对于三个生成的文件之一,一切都很好,但是对于另外两个,readFileSync始终返回零长度结果。

同样,文件肯定包含数据。

在文件上运行fs.statSync确实显示大小为0:-/例如,以下是其中一个文件的统计信息:

Stats {
  dev: 16777220,
  mode: 33188,
  nlink: 1,
  uid: 501,
  gid: 20,
  rdev: 0,
  blksize: 4194304,
  ino: 10106323,
  size: 0,
  blocks: 0,
  atimeMs: 1536239893064.3716,
  mtimeMs: 1536239915850.5076,
  ctimeMs: 1536239915850.5076,
  birthtimeMs: 1536239886797.752,
  atime: 2018-09-06T13:18:13.064Z,
  mtime: 2018-09-06T13:18:35.851Z,
  ctime: 2018-09-06T13:18:35.851Z,
  birthtime: 2018-09-06T13:18:06.798Z 
}

在我的生命中,我无法弄清楚为什么Node / OS似乎认为这些文件是空的。有人遇到过这种情况吗?抱歉,问题很广泛。

更新:事实证明,使用browserify构建的所有三个文件的行为相同。该文件似乎可以正常工作,因为它捆绑了另一个JS文件。当我单独运行代码时,我也没有返回任何数据。

以下是使用browserify生成文件的代码:

const entryFiles = config.editorBundles.split(',');

for (let file in entryFiles) {
  let currentFile = entryFiles[file];
  let outputBaseFileName = currentFile.substr(
    0,
    currentFile.indexOf('.js')
  );
  let writableOutputFile = fs.createWriteStream(
      path.join(__dirname, `${outputBaseFileName}-bundle.js`)
  );

try {
    let brfy = browserify(
        path.join(__dirname, entryFiles[file])
    ).bundle();
    brfy.pipe(writableOutputFile);
} catch (error) {
    console.error('MDN-BOB: (bundler.js/@compileJS)', error);
    reject(
        Error(
            'MDN-BOB: (bundler.js/@compileJS) Error while bundling and writing'
        )
    );
}

我想知道this(brfy.pipe(writableOutputFile);)写入文件的方式是否引起问题?

1 个答案:

答案 0 :(得分:0)

经过更多思考,看了一下代码,并且@ dpopp07的超级有用注释(.pipe是异步的),我意识到这里发生的是竞争状况。在发生读取时,写入很可能尚未完成。

在这种情况下,我不得不重构工作流程的发生方式。每件作品都已经包装在Promise中,但是,看到发生了一些异步工作,这并不能解决问题(显然;))。

因此,我将for循环从以前更改为以下功能:

function processAndWrite() {
    const entryFiles = config.editorBundles.split(',');
    let filePromises = [];

    for (let file in entryFiles) {
        let promise = new Promise((resolve, reject) => {
            let currentFile = entryFiles[file];
            let outputBaseFileName = currentFile.substr(
                0,
                currentFile.indexOf('.js')
            );
            let outputFilename = `${outputBaseFileName}-bundle.js`;
            let writableOutputFile = fs.createWriteStream(
                path.join(__dirname, outputFilename)
            );

            try {
                let reader = browserify(
                    path.join(__dirname, entryFiles[file])
                ).bundle();
                let writer = reader.pipe(writableOutputFile);
                reader.on('end', () => {
                    resolve(`${outputFilename} written to disk`);
                });
            } catch (error) {
                reject(
                    Error('MDN-BOB: (bundler.js/@compileJS) Error compiling JS')
                );
            }
        });
        filePromises.push(promise);
    }
    return filePromises;
}

然后我使用Promise.all传递filePromises数组。所有这些承诺完成后,我将继续执行该程序的其余部分。这样可以确保在以后读取文件之前一定已完成文件写入。 w00t