112

次のパスにファイルを書き込む必要があります。

fs.writeFile('/folder1/folder2/file.txt', 'content', function () {…});

ただし、'/folder1/folder2'パスが存在しない可能性があります。したがって、次のエラーが表示されます。

message=ENOENT、/folder1/folder2/file.txt を開く

そのパスにコンテンツを書き込むにはどうすればよいですか?

4

11 に答える 11

146

Node v10 の時点で、これはfs.mkdir関数に組み込まれており、これをpath.dirnameと組み合わせて使用​​できます。

var fs = require('fs');
var getDirName = require('path').dirname;

function writeFile(path, contents, cb) {
  fs.mkdir(getDirName(path), { recursive: true}, function (err) {
    if (err) return cb(err);

    fs.writeFile(path, contents, cb);
  });
}

古いバージョンでは、mkdirpを使用できます:

var mkdirp = require('mkdirp');
var fs = require('fs');
var getDirName = require('path').dirname;

function writeFile(path, contents, cb) {
  mkdirp(getDirName(path), function (err) {
    if (err) return cb(err);
    
    fs.writeFile(path, contents, cb);
  });
}

パス全体が既に存在する場合mkdirpは、noop です。それ以外の場合は、不足しているすべてのディレクトリが作成されます。

このモジュールは、必要なことを行います: https://npmjs.org/package/writefile。「writefile mkdirp」でググると出てきました。このモジュールは、コールバックを受け取る代わりに promise を返すため、最初に promise の紹介を読んでください。それは実際にあなたにとって物事を複雑にするかもしれません.

私が与えた機能は、どのような場合でも機能します。

于 2013-05-01T11:52:00.237 に答える
32

編集

NodeJS バージョンでは、 と次のオプションを使用して親ディレクターを再帰的に作成するため10.12.0のネイティブ サポートが追加されました。mkdirmkdirSyncrecursive: true

fs.mkdirSync(targetDir, { recursive: true });

そして、あなたが望むならfs Promises API、あなたは書くことができます

fs.promises.mkdir(targetDir, { recursive: true });

元の回答

親ディレクトリが存在しない場合は、再帰的に作成してください! (依存関係ゼロ)

const fs = require('fs');
const path = require('path');

function mkDirByPathSync(targetDir, { isRelativeToScript = false } = {}) {
  const sep = path.sep;
  const initDir = path.isAbsolute(targetDir) ? sep : '';
  const baseDir = isRelativeToScript ? __dirname : '.';

  return targetDir.split(sep).reduce((parentDir, childDir) => {
    const curDir = path.resolve(baseDir, parentDir, childDir);
    try {
      fs.mkdirSync(curDir);
    } catch (err) {
      if (err.code === 'EEXIST') { // curDir already exists!
        return curDir;
      }

      // To avoid `EISDIR` error on Mac and `EACCES`-->`ENOENT` and `EPERM` on Windows.
      if (err.code === 'ENOENT') { // Throw the original parentDir error on curDir `ENOENT` failure.
        throw new Error(`EACCES: permission denied, mkdir '${parentDir}'`);
      }

      const caughtErr = ['EACCES', 'EPERM', 'EISDIR'].indexOf(err.code) > -1;
      if (!caughtErr || caughtErr && curDir === path.resolve(targetDir)) {
        throw err; // Throw if it's just the last created dir.
      }
    }

    return curDir;
  }, initDir);
}

使用法

// Default, make directories relative to current working directory.
mkDirByPathSync('path/to/dir');

// Make directories relative to the current script.
mkDirByPathSync('path/to/dir', {isRelativeToScript: true});

// Make directories with an absolute path.
mkDirByPathSync('/path/to/dir');

デモ

それを試してみてください!

説明

  • [更新]EISDIRこのソリューションは、Mac や Windows などのEPERMプラットフォーム固有のエラーを処理EACCESします。
  • このソリューションは、相対パスと絶対パスの両方を処理します。
  • 相対パスの場合、ターゲット ディレクトリは現在の作業ディレクトリに作成 (解決) されます。それらを現在のスクリプト ディレクトリに対して相対的に解決するには、 を渡し{isRelativeToScript: true}ます。
  • クロスプラットフォームの問題を回避するために、連結だけでなくpath.sepandを使用します。path.resolve()/
  • fs.mkdirSync競合状態を処理するためにスローされた場合のエラーの使用と処理: 別のプロセスが呼び出しとtry/catch呼び出しの間にファイルを追加し、例外が発生する場合があります。 fs.existsSync()fs.mkdirSync()
    • それを達成するもう1つの方法は、ファイルが存在するかどうかを確認してから作成することif (!fs.existsSync(curDir) fs.mkdirSync(curDir);です。しかし、これはコードを競合状態に対して脆弱なままにするアンチパターンです。
  • 破壊をサポートするには、Node v6以降が必要です。(古い Node バージョンでこのソリューションを実装する際に問題がある場合は、コメントを残してください)
于 2016-11-18T22:31:13.793 に答える
21

おそらく最も簡単なのは、fs-path npm モジュールを使用することです。

コードは次のようになります。

var fsPath = require('fs-path');

fsPath.writeFile('/folder1/folder2/file.txt', 'content', function(err){
  if(err) {
    throw err;
  } else {
    console.log('wrote a file like DaVinci drew machines');
  }
});
于 2016-01-18T20:26:04.353 に答える
-1

Windows では、次のコードを使用できます。

 try {  
   fs.writeFileSync(  './/..//..//filename.txt' , 'the text to write in the file', 'utf-8' );
     }
 catch(e){ 
  console.log(" catch XXXXXXXXX "); 
    }

Windowsのこのコードは、現在のフォルダーの上の2つのフォルダーにファイルを作成します。

しかし、C:\ に直接ファイルを作成することはできません

于 2021-07-05T18:45:05.500 に答える