ファイル監視時のエラー「File to read not found or unreadable」はsublime textの設定で改善できるかもしれない

概要

テキストエディタ「sublime text」はファイル保存時のロック開放が遅い時があり、更新を監視していると「ファイルが見つからない、または使えないエラー」が出る事がある。
代替ファイルに一旦保存するオプション「atomic_save」を適用して解決した。

エラー「File to read not found or unreadable」が出たり出なかったり

SCSSをレンダリングするためにnode.jsを用いてSCSSファイルを監視していた。
更新すると時々「File to read not found or unreadable」エラーが出たり出なかったりした。

sublime textが原因だった

メモ帳では出なかったので、
使用しているエディタ「sublime text」がファイルをロックしているのだろうと推測。

エラーが起きた場合に再帰的にレンダリングを呼び出し、成功するまで無限ループさせる事でとりあえず目的は達成できた。
時々エラーは出続けたが。

「atomic_save: true」で解決

sublime textに代替ファイルに一旦保存するオプション「atomic_save」がある事を知った。

設定方法は
「基本設定」→「基本設定-ユーザー」
「{}」の中に
“atomic_save”: true,
を追加する。だけ。

備考:力技の成功するまでループ

一応再起ループの部分だけ掲載。
参考にならんと思うけど。

// index.js(npm-scriptsで実行しているファイル)

const fs       = require('fs');
const n_sass   = require("node-sass");

// SCSSファイルの更新を検知すると呼ばれる
function sass_flow(){
  return Promise.resolve()
  .then(()=>{
    console.log("render start");
    return sass_render("./css/style.scss","style.css");
  })
  .then((result)=>{
    console.log("writeFile start");
    return write_file("./style.css","./style.css.map",result);
  })
  .then(()=>{
    console.log("browser reload");
    bs.reload
  })
  // エラーをキャッチしたら自分を呼び直す
  .catch((err)=>{
    console.log("sass_flow de error catch!! 再帰呼び出し!!");
    console.log(err);
    sass_flow(); 
  });
}


const sass_render = (input,output)=>{
  return new Promise(function(resolve,reject){
    n_sass.render({
      file: input,
      outputStyle: 'expanded',
      sourceMap: true,
      outFile: output
    },
    function(error,result){
      if(error){
        // console.log(error);
        reject(error);
      }else{
        console.log("render success");
        resolve(result);
      }
    });
  });
}

//cssとmapを書き込んだらresolveを返す
const write_file = function(file,map,renderResult){
  let path_css = file;
  let path_map = map;

  return new Promise(function(big_resolve,big_reject){
    Promise.resolve()
    .then(function(){
      write_the_file(path_css, renderResult.css);
    })
    .then(function(){
      write_the_file(path_map, renderResult.map.toString());
    })
    .then(function(){
      big_resolve();
    })
    .catch(function(err){
      //error処理
      // console.log(err);
      big_reject(err);
    });
  });
}

function write_the_file(path,str){
  return new Promise(function(res,rej){
    fs.writeFile(path, str, function(err){
      if(!err){
        res();
      }else{
        rej(err);
      }
    });
  });
}

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です