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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了即使文件存在,readFileSync也不返回任何数据相关的知识,希望对你有一定的参考价值。

tl;博士

readFileSync在读取~24kb的文件后返回零大小的结果。没有错误被抛出。

不是那么;博士

首先,我使用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'
        )
    );
}

我想知道这个(brfy.pipe(writableOutputFile);)写入文件的方式是否导致问题?

答案

在考虑了一些问题后,查看代码,以及来自@ dpopp07(.pipe是异步)的超级有用的评论,我意识到这里发生的事情是竞争条件。在读取发生的时刻,写入很可能没有完成。

既然如此,我不得不重构工作流程是如何发生的。每件作品都已经包裹在Promise中,但是,看到发生了一些异步工作,这并没有解决问题(显然;))。

因此我将qazxsw poi循环从之前更改为以下函数:

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数组。一旦所有这些承诺完成,我就会继续执行该程序的其余部分。这确保了文件在以后读取之前肯定已完成写入。 w00t

以上是关于即使文件存在,readFileSync也不返回任何数据的主要内容,如果未能解决你的问题,请参考以下文章

即使存在,Mongo也不返回文件

JS:为什么fs.readFileSync()返回缓冲区,即使我之前使用toString()将其转换为字符串?

即使存在与之关联的镶木地板文件,Hive 外部表也不显示任何数据

即使有数据,JPQL 也不返回任何结果

即使键存在,Python dict.get(k) 也不返回

为啥这个 PHP MongoDB 查询即使有结果也不返回任何结果?