Javascript-форум (https://javascript.ru/forum/)
-   Node.JS (https://javascript.ru/forum/node-js-io-js/)
-   -   Node.js и fs-extra (https://javascript.ru/forum/node-js-io-js/83737-node-js-i-fs-extra.html)

Raadsert 28.02.2022 01:30

Node.js и fs-extra
 
Здравствуйте.

Подскажите пожалуйста, не могу понять логику работы функции fs.outputJson()

Если она не может найти файл то будет создавать его, а дело в том что я немного запутался в логике восприятия пути к файлам.

Как пример, вот такое дерево каталогов:

module
-index.js // тут запускается функция fs.outputJson()
dir
-foo // в этом каталоге создание файла
--exemple.json

И так, к примеру если указать так:
fs.outputJson('../dir/foo/file.json', {name: "foo"})


По какой-то причине файл не создастся, что для меня кажется непонятным ведь путь к директории указан правильно.

А если указать так:

fs.outputJson(path.resolve(__dirname, '..', 'dir', 'foo', 'file.json'), {name: "foo"})


То файл будет создан. Это из-за особенности функции path.resolve() которая ставит слеши в нужную строну? Тогда почему такой вариант будет работать?

fs.readdir('../dir/foo')


Объясните пожалуйста почему так происходит, не могу понять. (Документацию читал но не нашёл объяснения этому)

ksa 28.02.2022 10:35

Цитата:

Сообщение от Raadsert
Это из-за особенности функции path.resolve() которая ставит слеши в нужную строну?

Именно из-за ее "особенностей" работы. :yes:
Мало того.
Указывая __dirname используется абсолютный путь.

Raadsert 28.02.2022 14:10

Цитата:

Сообщение от ksa (Сообщение 544006)
Именно из-за ее "особенностей" работы. :yes:
Мало того.
Указывая __dirname используется абсолютный путь.

А почему тогда работает fs.readdir('../dir/foo') ?

ksa 28.02.2022 14:35

Raadsert, пока ты кидаешь огрызки своих программ - ничего путнего не ответить. :no:
Делай полный тестовый пример. Описывай какая операционка у тебя на сервере.
Тогда твой пример при желании можно будет потестить у себя.
Я в своих программах использую вот такой вариант касательно путей
Цитата:

Сообщение от Raadsert
fs.outputJson(path.resolve(__dirname, '..', 'dir', 'foo', 'file.json'), {name: "foo"})

Поскольку разработка ведется на вин-компах, а рабочий сервер уже использует "линуксовые варианты".

Raadsert 28.02.2022 15:19

Цитата:

Сообщение от ksa (Сообщение 544009)
Raadsert, пока ты кидаешь огрызки своих программ - ничего путнего не ответить. :no:
Делай полный тестовый пример. Описывай какая операционка у тебя на сервере.
Тогда твой пример при желании можно будет потестить у себя.
Я в своих программах использую вот такой вариант касательно путей

Поскольку разработка ведется на вин-компах, а рабочий сервер уже использует "линуксовые варианты".

Сервер у меня на линуксе. А что на счёт готового варианта, вот...

Дерево каталогов:

module
-index.js // тут запускается функция fs.outputJson()
dir
-foo // в этом каталоге создание файла
--exemple.json

Код из файла index.js:
const fs = require('fs-extra');
const length = fs.readdirSync('../dir/foo').length;


length выдаёт значение количества файлов в каталоге foo.

ksa 28.02.2022 16:58

Цитата:

Сообщение от Raadsert
А что на счёт готового варианта, вот...

Уже хоть что-то...
Но ты не указал состав package.json :(
У меня он получился вот такой
{
  "name": "module",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "keywords": [],
  "author": "",
  "license": "ISC",
  "dependencies": {
    "fs-extra": "^10.0.1"
  }
}

Я взял твой пример... Запустил... Потом дописал то что у тебя не работало...
И оно у меня прекрасно отработало. Даже на вин-операционке
const fs = require('fs-extra');
const length = fs.readdirSync('../dir/foo').length
console.log(length)
fs.outputJson('../dir/foo/file.json', {name: "foo"})

Т.е. файл file.json благополучно был создан по указанному пути.

Raadsert 28.02.2022 18:31

Цитата:

Сообщение от ksa (Сообщение 544012)
Уже хоть что-то...
Но ты не указал состав package.json :(
У меня он получился вот такой
{
  "name": "module",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "keywords": [],
  "author": "",
  "license": "ISC",
  "dependencies": {
    "fs-extra": "^10.0.1"
  }
}

Я взял твой пример... Запустил... Потом дописал то что у тебя не работало...
И оно у меня прекрасно отработало. Даже на вин-операционке
const fs = require('fs-extra');
const length = fs.readdirSync('../dir/foo').length
console.log(length)
fs.outputJson('../dir/foo/file.json', {name: "foo"})

Т.е. файл file.json благополучно был создан по указанному пути.

Вот и я считаю это странным, у меня по какой то причине это работает
fs.readdirSync('../dir/foo').length
а это нет
fs.outputJson('../dir/foo/file.json', {name: "foo"})
Возможно у вас есть какие то предположения о том из-за чего это может происходить?

ksa 28.02.2022 20:07

Цитата:

Сообщение от Raadsert
Возможно у вас есть какие то предположения о том из-за чего это может происходить?

И мой пример у тебя не запускается?
Если нет - значит это у тебя какие-то особенности.

voraa 01.03.2022 11:06

Цитата:

Сообщение от Raadsert
Возможно у вас есть какие то предположения о том из-за чего это может происходить?

С правами на запись в каталог все в порядке?

Raadsert 01.03.2022 15:19

Цитата:

Сообщение от voraa (Сообщение 544016)
С правами на запись в каталог все в порядке?

Абсолютно. Такой вариант запишет файл:
fs.outputJson(path.resolve(__dirname, '..', 'dir', 'foo', 'file.json'), {name: "foo"})

А такой нет:
fs.outputJson('../dir/foo/file.json', {name: "foo"})


Часовой пояс GMT +3, время: 06:25.