今天遇到一个看起来很神奇的错误,最后解决了,大家引以为鉴
发布于 12 年前 作者 xiongliding 4728 次浏览 最后一次编辑是 8 年前

这个问题是我在读取文件时遇到的,最初的代码是这样:

fs.readFile(folder + '/' + 'article.markdown', 'utf-8', function(err, content) {
  // 处理 content
});

一切正常。

后来考虑到 markdown 还有很多种常用的后缀,比如 .md .mdown 等,以及以后可能会扩展到其他类型的文件,我把代码改成了这样:

fs.readdir(folder, function (err, files) {
  for (var i = 0; i < files.length; i++) {
    // 这样可以匹配所有 article.* 文件
    if (/^article\..*$/.test(files[i])) {
      fs.readFile(folder + '/' + files[i], 'utf-8', function (err, content) {
        // 处理 content
      } 
    }
    return ;
  }
});

结果表现出了一种奇怪的现象,用 vim 编辑 article.markdown 文件必须保存两次,才能在 node 里读到修改后的版本。我一开始还以为 Node 有什么我不知道的缓存机制,结果发现——大家思考一下吧,印象会比较深刻,原因发在回复里。

4 回复

最后发现,原因是 vim 保存时会生成一个名为 article.markdown~ 的文件,也能匹配正则表达式 /^article\..*$/ ,而且在 fs.readdir 得到的 files 数组中, article.markdown~ 排在 article.markdown 之前。所以读取的其实都是 article.markdown~ 。

而 article.markdown~ 的内容就是 article.markdown 上一次保存的内容,所以出现了必须保存两次才有效果的现象。

遇到的时候,真是令人抓狂

原来 Vim 还这么一招… 以前看系统无故多处了 ~ 结尾的文件, 我还以为误用了 Gedit

不少编辑器的后缀都是 ~

@XiongLiding 对了你是打印 .readdir() 的结果发现 ~ 结尾对吧? 符号在 Google 不能搜, 细节都没有了

回到顶部