DigDir

array
Javascript contenant un objet pour chaque fichier/répertoire rencontré avec son nom, sa date de création, sa date de modification, son chemin et le chemin de son parent.J’étais parti sur une librairie existante mais je n’étais pas satisfait. Le format obtenu ne correspondait pas à mon besoin et il fallait donc que je remodèle les données. Finalement je me suis dit qu’écrire ma propre librairie serait préférable.
DigDir devait s’appeler WalkDir mais le nom était déjà pris sur le dépôt npm. J’ai donc cherché un autre nom qui pouvait avoir du sens pour éviter de publier la librairie avec mon nom utilisateur devant (@utilisateur/walk-dir
). J’ai donc choisi de la renommer DigDir puisque l’idée est de creuser encore et encore un répertoire pour extraire tout son contenu.
DigDir est une librairie Node.js permettant de récupérer récursivement le contenu d’un dossier. Vous fournissez le chemin du répertoire à explorer et DigDir vous retourne un object Javascript respectant la structure du dossier. Il est possible de passer quelques options/filtres pour modeler l’objet retourné.
Techniquement :
DigDir est disponible sur le site de npm, vous pouvez donc l’installer dans votre projet avec l’une de ces commandes :
# With npm
npm install dig-dir
# With yarn
yarn add dig-dir
# With pnpm
pnpm add dig-dir
Tout d’abord, vous devez l’importer dans votre projet. DigDir est conçu pour fonctionner aussi bien avec CommonJS qu’avec ESM.
import digDir from 'dig-dir';
import { resolve } from 'path';
const cheminDeCeFichier = new URL('.', import.meta.url).pathname;
const cheminAbsoluDuDossier = resolve(cheminDeCeFichier, './chemin-relatif-du-dossier');
const donneesExtraites = await digDir(cheminAbsoluDuDossier);
console.log(donneesExtraites);
const digDir = require('dig-dir');
const path = require('path');
const cheminAbsoluDuDossier = path.resolve(__dirname, './chemin-relatif-du-dossier');
digDir(cheminAbsoluDuDossier).then((donneesExtraites) => console.log(donneesExtraites));
La fonction digDir
accepte trois paramètres :
Les options consistent en un objet Javascript :
filters
(optionnel) : un objet permettant d’ajouter des filtrers,includeFileContent
(optionnel) : permet d’inclure le contenu de chaque fichier rencontré,depth
(optionnel) : permet de limiter la profondeur de recherche (si non définie, DigDir continue tant qu’il existe des sous-dossiers).Les filtres sont également représenté avec un objet Javascript :
extensions
(optionnel) : permet de filtrer les fichiers retournés par extension (il s’agit d’un array
donc il est possible de fournir plusieurs extensions),filename
(optionnel) : permet de filtrer les fichiers/répertoires par nom (il ne s’agit pas d’une recherche exacte mais partielle),type
(optionnel) : permet de limiter la recherche aux fichiers ou dossiers.Si vous avez un dossier ressemblant à :
racine
├── folder1
│ └── subFolder1
│ ├── document.odt
│ └── note.txt
├── folder2
│ ├── emptySubFolder
│ ├── .config
│ └── readme.md
└── readme.md
DigDir (sans passer d’options) vous retournera un array
ressemblant à :
[
{
createdAt: '2022-08-03T12:07:05.230Z',
id: 'Li9mb2xkZXIx',
name: 'folder1',
parent: undefined,
path: './folder1',
type: 'directory',
updatedAt: '2022-08-03T12:07:09.927Z',
files: [],
subdirectories: [
{
createdAt: '2022-08-03T12:07:09.927Z',
id: 'Li9mb2xkZXIxL3N1YkZvbGRlcjE=',
name: 'subFolder1',
parent: { name: 'folder1', path: './folder1' },
path: './folder1/subFolder1',
type: 'directory',
updatedAt: '2022-08-03T12:09:11.859Z',
files: [
{
createdAt: '2022-08-03T12:08:56.282Z',
id: 'Li9mb2xkZXIxL3N1YkZvbGRlcjEvZG9jdW1lbnQub2R0',
name: 'document',
parent: { name: 'subFolder1', path: './folder1/subFolder1' },
path: './folder1/subFolder1/document.odt',
type: 'file',
updatedAt: '2022-08-03T12:08:56.282Z',
extension: '.odt',
content: undefined,
},
{
createdAt: '2022-08-03T12:07:23.200Z',
id: 'Li9mb2xkZXIxL3N1YkZvbGRlcjEvbm90ZS50eHQ=',
name: 'note',
parent: { name: 'subFolder1', path: './folder1/subFolder1' },
path: './folder1/subFolder1/note.txt',
type: 'file',
updatedAt: '2022-08-03T12:07:23.200Z',
extension: '.txt',
content: undefined,
},
],
subdirectories: [],
},
],
},
{
createdAt: '2022-08-03T12:07:28.543Z',
id: 'Li9mb2xkZXIy',
name: 'folder2',
parent: undefined,
path: './folder2',
type: 'directory',
updatedAt: '2022-08-03T12:07:50.463Z',
files: [
{
createdAt: '2022-08-03T12:07:38.343Z',
id: 'Li9mb2xkZXIyLy5jb25maWc=',
name: '.config',
parent: { name: 'folder2', path: './folder2' },
path: './folder2/.config',
type: 'file',
updatedAt: '2022-08-03T12:07:38.343Z',
extension: '',
content: undefined,
},
{
createdAt: '2022-08-03T12:07:50.463Z',
id: 'Li9mb2xkZXIyL3JlYWRtZS5tZA==',
name: 'readme',
parent: { name: 'folder2', path: './folder2' },
path: './folder2/readme.md',
type: 'file',
updatedAt: '2022-08-03T12:07:50.463Z',
extension: '.md',
content: undefined,
},
],
subdirectories: [
{
createdAt: '2022-08-03T12:07:32.803Z',
id: 'Li9mb2xkZXIyL2VtcHR5U3ViRm9sZGVy',
name: 'emptySubFolder',
parent: { name: 'folder2', path: './folder2' },
path: './folder2/emptySubFolder',
type: 'directory',
updatedAt: '2022-08-03T12:07:32.803Z',
files: [],
subdirectories: [],
},
],
},
{
createdAt: '2022-08-03T12:08:05.866Z',
id: 'Li9yZWFkbWUubWQ=',
name: 'readme',
parent: undefined,
path: './readme.md',
type: 'file',
updatedAt: '2022-08-03T12:08:05.866Z',
extension: '.md',
content: undefined,
},
];
Comme je le disais en introduction, il existe d’autres librairies similaires. Si DigDir ne vous convient pas, celles-ci vous conviendront peut-être :
• directory-tree
• folder-reader
• folder-walker
• @folder/readdir
La liste n’est pas exhaustive. Il existe d’autres libraires que vous pouvez trouver sur le dépôt npm. Je ne les ai pas essayées/listées pour différentes raisons : le format obtenu n’est pas précisé, elles me semblaient trop complexes pour mon besoin ou encore elles n’étaient pas documentées dans une langue que je lis.