Возникают проблемы с пониманием того, как работает fs.stat () - PullRequest
14 голосов
/ 21 декабря 2011

Я пытаюсь написать функцию, которая сообщает мне, что определенный путь является каталогом.

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

Однако, он никогда не печатает ответ.

Если путь существует - онне вызывает функцию.Если он не существует, он генерирует исключение: ENOENT not a file or directory.Я не хочу знать, что путь существует, но я хочу знать, если это каталог.

Может кто-нибудь помочь мне исправить это?

Ответы [ 2 ]

28 голосов
/ 21 декабря 2011

Вы используете синхронную версию, которая не использует обратный вызов.Вместо этого он просто возвращает результат.Поэтому либо используйте асинхронную форму fs.stat(path, callback), либо используйте форму синхронизации следующим образом:

var fs = require('fs');
console.log("+++++++++++++++++++++++++++++++++++++++");
var stats = fs.statSync(pathname);
console.log(stats.isDirectory());
console.log("+++++++++++++++++++++++++++++++++++++++");
6 голосов
/ 19 октября 2017

Как работает 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: Идентификатор устройства, содержащего файл
  • режим: защита файлов
  • nlink: количество жестких ссылок на файл
  • uid: идентификатор пользователя владельца файла.
  • gid: идентификатор группы владельца файла.
  • rdev: идентификатор устройства, если файл является специальным файлом.
  • blksize: размер блока для ввода-вывода файловой системы.
  • ino: Номер индекса файла. Inode - это структура данных файловой системы, которая -
  • хранит информацию о файле.
  • размер: общий размер файла в байтах.
  • блоков: количество блоков, выделенных для файла.
  • atime: объект даты, представляющий время последнего доступа к файлу.
  • mtime: объект даты, представляющий время последнего изменения файла.
  • ctime: объект даты, представляющий время последнего изменения индекса файла.

Вы также можете, например, в документации к 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 не следует по символическим ссылкам. Если указан путь, который является символической ссылкой, он возвращает статистику символической ссылки, а не ее цель.
...