Подтвердить что ты не робот

Как мне взаимодействовать с этим объектом <File> в потоке node.js?

Я использую gulp для создания потока файлов, сопоставленных glob, и перемещаю их по своей вложенной структуре в новое место. Для этого я сначала хотел создать простой сквозной поток, чтобы посмотреть, что я передаю, если я подключу его к gulp.src().

Вот мой тест gulpfile.js:

var through = require("through");
var fs = require("fs");

function write(file) {
  console.log(file);
  console.log(file.toString());
}

gulp.task("move", function () {

  return gulp.src("./**")
    .pipe(through(write));

});

Если я запустил задачу gulp 'move' в командной строке, я получаю вывод следующим образом:

<File "some/path">
[object Object]
<File "some/path/file.js" <Buffer 2f 2a 0a 0a 4f 72 67 69 6e 61 6c 20 53 74 79 6c 65 20 66 72 6f 6d 20 65 74 68 61 6e 73 63 68 6f 6f 6e 6f 76 65 72 2e 63 6f 6d 2f 73 6f 6c 61 72 69 7a 65 ...>>
[object Object]

Что это за объекты? Как я могу взаимодействовать с ними?

4b9b3361

Ответ 1

Это vinyl объекты. Они представляют собой основной тип данных, передаваемых через потоки gulp. Содержит информацию о файле (такую ​​как информация о пути и содержимое в виде буфера или потока). Вы можете лучше видеть данные, используя gulp-debug.

Если вы хотите переместить кучу файлов, сохраняя их относительный путь, вы можете сделать одно из следующего: не нужно самостоятельно вставлять код:

gulp.src('/a/single/src/path/**/*.foo').pipe(gulp.dest('/a/single/dest/path'));

Или, если у вас есть куча разных глобусов:

gulp.src(['/a/src/path/foo/**/*.foo', '/a/src/path/bar/**/*.bar'], {base: '/a/src/path/'})
    .pipe(gulp.dest('/a/dest/path/'));

В основном вы будете использовать gulp плагины для управления файлами, а затем передать результат gulp.dest(), а не самостоятельно манипулировать ими.

Если вам нужно манипулировать файлами, есть несколько плагинов, которые могут помочь:

  • gulp-tap позволяет вам пик в потоке и, возможно, изменять файл или буфер.
  • vinyl-map позволяет легко изменять содержимое файлов
  • gulp-filter может помочь вам фильтровать поток, если сглаживание не работает.

Ответ 2

Вы можете просмотреть свойства файла, используя этот js:

var propValue;
for(var propName in file) {
    propValue = file[propName];
    console.log('name:' + propName, ', value:<<<',propValue,'>>>');
}

Sample Output
    name:history ,     value:"C:\Temp\test.txt"
    name:cwd ,         value:"C:\Temp"
    name:base ,        value:"C:\Temp"
    name:_contents ,   value: full file contents
    name:isBuffer ,    value:"function () {
    name:isStream ,    value:"function () {
    name:isNull ,      value:"function () {
    name:isDirectory , value:"function () {
    name:clone ,       value:"function (opt) {
    name:pipe ,        value:"function (stream, opt) {
    name:inspect ,     value:"function () {
    name:stat , value:<<< { dev: 0,
      mode: 33206,
      nlink: 1,
      uid: 0,
      gid: 0,
      rdev: 0,
      ino: 0,
      size: 874,
      atime: Sat Sep 19 2015 14:34:51 GMT+1000 (AUS Eastern Standard Time),
      mtime: Sat Sep 19 2015 14:34:51 GMT+1000 (AUS Eastern Standard Time),
      ctime: Sat Sep 12 2015 14:59:40 GMT+1000 (AUS Eastern Standard Time) } >>>

Usage:
console.log('file name:', file.relative);
console.log('file current working directory:', file.cwd);
console.log('file isDirectory:', file.isDirectory());

Ответ 3

Для тех, кто также наткнулся на это и не хочет использовать глоток, вот как я это сделал:

Предполагаемые files представляют собой массив виниловых объектов -

        const outputPath = ... // some directory path

        files.forEach(file => {
            const filePath = path.join(outputPath, file.relative);
            // if its a directory then create the directory if not already present
            if (file.isDirectory()) {
              if (!fs.existsSync(filePath)) {
                fs.mkdirSync(filePath, { recursive: true });
              }
            } else {
              // if its a file then save the contents of the file
              fs.writeFileSync(filePath, file.contents);
            }
          });