201

私は Node.js をいじっていて、小さな問題を見つけました。というディレクトリにスクリプトがありますdata。スクリプトで、サブディレクトリ内のサブディレクトリ内のファイルにデータを書き込む必要がありますdata。ただし、次のエラーが発生します。

{ [Error: ENOENT, open 'D:\data\tmp\test.txt'] errno: 34, code: 'ENOENT', path: 'D:\\data\\tmp\\test.txt' }

コードは次のとおりです。

var fs = require('fs');
fs.writeFile("tmp/test.txt", "Hey there!", function(err) {
    if(err) {
        console.log(err);
    } else {
        console.log("The file was saved!");
    }
}); 

ファイルへの書き込みのために終了しない場合、Node.jsにディレクトリ構造を作成させる方法を見つけるのを手伝ってくれる人はいますか?

4

8 に答える 8

208

ノード > 10.12.0

fs.mkdirは次のようなオプションを受け入れる{ recursive: true }ようになりました:

// Creates /tmp/a/apple, regardless of whether `/tmp` and /tmp/a exist.
fs.mkdir('/tmp/a/apple', { recursive: true }, (err) => {
  if (err) throw err;
});

または約束して:

fs.promises.mkdir('/tmp/a/apple', { recursive: true }).catch(console.error);

ノード <= 10.11.0

これは、 mkdirpfs-extraなどのパッケージで解決できます。パッケージをインストールしたくない場合は、以下の Tiago Peres Franca の回答を参照してください。

于 2012-11-24T18:54:26.743 に答える
61

node-fs-extraを使えば簡単にできます。

インストールする

npm install --save fs-extra

次に、outputFileメソッドを使用します。そのドキュメントには次のように記載されています。

writeFile親ディレクトリが存在しない場合は作成されることを除いて、(つまり、上書きする) とほとんど同じです。

4通りの使い方ができます。

非同期/待機

const fse = require('fs-extra');

await fse.outputFile('tmp/test.txt', 'Hey there!');

Promise の使用

promisesを使用する場合、これはコードです。

const fse = require('fs-extra');

fse.outputFile('tmp/test.txt', 'Hey there!')
   .then(() => {
       console.log('The file has been saved!');
   })
   .catch(err => {
       console.error(err)
   });

コールバック スタイル

const fse = require('fs-extra');

fse.outputFile('tmp/test.txt', 'Hey there!', err => {
  if(err) {
    console.log(err);
  } else {
    console.log('The file has been saved!');
  }
})

同期バージョン

同期バージョンが必要な場合は、次のコードを使用してください。

const fse = require('fs-extra')

fse.outputFileSync('tmp/test.txt', 'Hey there!')

完全なリファレンスについては、outputFileドキュメントnode-fs-extra でサポートされているすべてのメソッドを確認してください。

于 2017-08-02T16:09:41.047 に答える
27

ハレンチプラグアラート!

必要なパス構造の各ディレクトリを確認し、存在しない場合は手動で作成する必要があります。これを行うためのすべてのツールは Node の fs モジュールに既に含まれていますが、mkpath モジュールを使用するだけですべてを行うことができます: https://github.com/jrajav/mkpath

于 2012-11-24T15:35:58.723 に答える
9

私のアドバイスは次のとおりです。数行のコードで簡単に実行できる場合は、依存関係に依存しないようにしてください

14行のコードで達成しようとしているのは次のとおりです。

fs.isDir = function(dpath) {
    try {
        return fs.lstatSync(dpath).isDirectory();
    } catch(e) {
        return false;
    }
};
fs.mkdirp = function(dirname) {
    dirname = path.normalize(dirname).split(path.sep);
    dirname.forEach((sdir,index)=>{
        var pathInQuestion = dirname.slice(0,index+1).join(path.sep);
        if((!fs.isDir(pathInQuestion)) && pathInQuestion) fs.mkdirSync(pathInQuestion);
    });
};
于 2016-11-02T17:02:41.687 に答える
5

上記と同じ答えですがasync await、すぐに使用できます!

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

async function isExists(path) {
  try {
    await fs.access(path);
    return true;
  } catch {
    return false;
  }
};

async function writeFile(filePath, data) {
  try {
    const dirname = path.dirname(filePath);
    const exist = await isExists(dirname);
    if (!exist) {
      await fs.mkdir(dirname, {recursive: true});
    }
    
    await fs.writeFile(filePath, data, 'utf8');
  } catch (err) {
    throw new Error(err);
  }
}

例:

(async () {
  const data = 'Hello, World!';
  await writeFile('dist/posts/hello-world.html', data);
})();
于 2021-01-07T15:52:51.493 に答える
2

この機能が必要だったので、このモジュールを公開しました。

https://www.npmjs.org/package/filendir

Node.js の fs メソッドのラッパーのように機能します。fs.writeFileそのため、 and とまったく同じように使用できますfs.writeFileSync(非同期書き込みと同期書き込みの両方) 。

于 2014-05-10T10:19:48.820 に答える