web-dev-qa-db-fra.com

Comment interagir avec cet objet <Fichier> dans un flux node.js?

J'utilise gulp pour créer un flux de fichiers globaux et les déplacer tous, dans leur structure imbriquée, vers un nouvel emplacement. Pour ce faire, j'ai d'abord voulu créer un simple flux 'through' pour voir ce que je suis passé si je le transmettais à partir de gulp.src ().

Voici mon test 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));

});

Si j'exécute la tâche 'move' gulp sur la ligne de commande, le résultat est le suivant:

<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]

Quels sont ces objets? Comment puis-je interagir avec eux?

19
rhodesjason

Ce sont des objets vinyl . Ils constituent le type de données de base transmis par les flux gulp. Le contient des informations sur le fichier (telles que les informations de chemin et le contenu sous forme de tampon ou de flux). Vous pouvez mieux voir les données en utilisant gulp-debug .

Si vous souhaitez déplacer un groupe de fichiers tout en conservant leur chemin relatif, vous pouvez effectuer l'une des opérations suivantes. Vous n'avez pas besoin de creuser vous-même le code:

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

Ou, si vous avez un tas de globes différents:

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

Généralement, vous utiliserez gulp plugins pour manipuler les fichiers, puis passerez le résultat à gulp.dest(), plutôt que de les manipuler vous-même.

Si vous avez besoin pour manipuler les fichiers, quelques plugins peuvent vous aider:

  • gulp-tap vous permet d'entrer dans le flux et de modifier éventuellement le fichier ou le tampon.
  • vinyl-map vous permet de modifier facilement le contenu des fichiers
  • gulp-filter peut vous aider à filtrer le flux si la suppression ne fonctionne pas.
26
OverZealous

Vous pouvez voir les propriétés du fichier en utilisant ce 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());
10
user1491819

Pour ceux qui sont également tombés sur cela et ne veulent pas utiliser gulp, voici comment je l'ai fait

En supposant que files est un tableau de vinyl objects - 

        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);
            }
          });
0
Sohail