web-dev-qa-db-ja.com

fs.stat()がどのように機能するかを理解するのに問題がある

特定のパスがディレクトリであることを通知する関数を作成しようとしています。

var fs = require('fs');
console.log("+++++++++++++++++++++++++++++++++++++++");
fs.statSync(pathname, function(err, stats) {
    console.log(stats.isDirectory());
});
console.log("+++++++++++++++++++++++++++++++++++++++");

ただし、回答が出力されることはありません。

パス名が存在する場合、関数は呼び出されません。存在しない場合は、例外が生成されます:ENOENT not a file or directory。パス名が存在することは知りたくありませんが、ディレクトリかどうかは知りたいです。

誰かが私がそれを修正するのを手伝ってもらえますか?

15
Asher Saban

コールバックを使用しない同期バージョンを使用しています。代わりに結果を返すだけです。したがって、非同期フォームfs.stat(path, callback)を使用するか、次のような同期フォームを使用します。

var fs = require('fs');
console.log("+++++++++++++++++++++++++++++++++++++++");
var stats = fs.statSync(pathname);
console.log(stats.isDirectory());
console.log("+++++++++++++++++++++++++++++++++++++++");
29
Alex Wayne

Fs.stat()はどのように機能しますか?

コールバック/非同期fs関数を使用する場合は、同期バージョンを使用せず、fs.stat()を使用します。

var fs = require('fs');
console.log("+++++++++++++++++++++++++++++++++++++++");
fs.stat(pathname, function(err, stats) {
    console.log(stats.isDirectory());
});
console.log("+++++++++++++++++++++++++++++++++++++++");

fs.stat() に関する詳細情報があります。メインオブジェクトに関する多くの情報を取得できます。

fs.stat(path, function(err, stats) {
      console.log(stats)
}

出力:

{ dev: 2049,
  ino: 305352,
  mode: 16877,
  nlink: 12,
  uid: 1000,
  gid: 1000,
  rdev: 0,
  size: 4096,
  blksize: 4096,
  blocks: 8,
  atime: '2009-06-29T11:11:55Z',
  mtime: '2009-06-29T11:11:40Z',
  ctime: '2009-06-29T11:11:40Z' }

はい、多くの要素は私たちにとって役に立たないことがよくあります。しかし、ここにこれらすべての変数の意味があります この記事によると

  • dev:ファイルを含むデバイスのID
  • モード:ファイル保護
  • nlink:ファイルへのハードリンクの数
  • uid:ファイルの所有者のユーザーID。
  • gid:ファイルの所有者のグループID。
  • rdev:ファイルが特殊ファイルの場合はデバイスID。
  • blksize:ファイルシステムI/Oのブロックサイズ。
  • ino:ファイルのiノード番号。 iノードはファイルシステムのデータ構造です。
  • ファイルに関する情報を格納します
  • size:ファイルの合計サイズ(バイト単位)。
  • blocks:ファイルに割り当てられたブロックの数。
  • atime:ファイルの最終アクセス時刻を表す日付オブジェクト。
  • mtime:ファイルの最終変更時刻を表す日付オブジェクト。
  • ctime:ファイルのiノードが最後に変更された時刻を表す日付オブジェクト。

nodeJSドキュメントによると のように、次のような詳細情報を取得することもできます。

stats.isFile()
stats.isDirectory()
stats.isBlockDevice()
stats.isSymbolicLink() (only valid with fs.lstat())
stats.isCharacterDevice()
stats.isFIFO()
stats.isSocket()

Stats.isSymbolicLink()については、fs.statとは別の関数fs.lstat()があり、それらの違いは次のとおりです。

  • statはシンボリックリンクに従います。シンボリックリンクであるパスが与えられると、シンボリックリンクのターゲットの統計を返します。
  • lstatはシンボリックリンクをたどりません。シンボリックリンクであるパスが与えられると、ターゲットではなくシンボリックリンクの統計を返します。
7
Arthur Lacoste