1149 Stimmen

Wie man ein Verzeichnis erstellt, wenn es mit Node.js nicht existiert

Ist dies der richtige Weg, um ein Verzeichnis zu erstellen, wenn es nicht existiert?

Es sollte volle Berechtigung für das Skript haben und von anderen lesbar sein.

var dir = __dirname + '/upload';
if (!path.existsSync(dir)) {
    fs.mkdirSync(dir, 0744);
}

41voto

LeOn - Han Li Punkte 8102

Die Einzeiler-Version:

// Oder in TypeScript: import * as fs from 'fs';
const fs = require('fs');
!fs.existsSync(dir) && fs.mkdirSync(dir);

28voto

xgqfrms Punkte 7010

Lösungen

  1. CommonJS

    const fs = require('fs'); const path = require('path');

    const dir = path.resolve(path.join(__dirname, 'upload');

    if (!fs.existsSync(dir)) { fs.mkdirSync(dir); }

    // ODER if (!fs.existsSync(dir)) { fs.mkdirSync(dir, { mode: 0o744, // Nicht auf Windows unterstützt. Standard: 0o777 }); }

  2. ESM

Aktualisieren Sie Ihre package.json Datei-Konfiguration

{
  // deklarieren Sie die Verwendung von ECMAScript-Modulen (ESM)
  "type": "module",
  //...
}

import fs from 'fs';
import path from 'path';
import { fileURLToPath } from 'url';

// Erstellen Sie ein benutzerdefiniertes `__dirname`, da es in der ES-Modul-Umgebung nicht existiert.
// Verwenden Sie `import.meta.url`, um die URL des aktuellen Moduls zu erhalten,
// dann erhalten Sie den absoluten Pfad des Ordners des Moduls
const __filename = fileURLToPath(import.meta.url);
const __dirname = path.dirname(__filename);
const dir = path.resolve(path.join(__dirname, 'upload');

if (!fs.existsSync(dir)) {
  fs.mkdirSync(dir);
}

// ODER
if (!fs.existsSync(dir)) {
  fs.mkdirSync(dir, {
    mode: 0o744, // Nicht auf Windows unterstützt. Standard: 0o777
  });
}

Aktualisierung 2022

import { existsSync } from 'node:fs';

Verweise

NodeJS Version: v18.2.0

https://nodejs.org/api/fs.html#fsexistssyncpath

https://nodejs.org/api/fs.html#fsmkdirsyncpath-options

https://nodejs.org/api/url.html#urlfileurltopathurl

https://github.com/nodejs/help/issues/2907#issuecomment-757446568

ESM: ECMAScript-Module

https://nodejs.org/api/esm.html#introduction

22voto

SamGoody Punkte 12604

Sie können einfach mkdir verwenden und den Fehler abfangen, wenn der Ordner bereits vorhanden ist.
Das ist asynchron (also bewährte Praxis) und sicher.

fs.mkdir('/path', err => { 
    if (err && err.code != 'EEXIST') throw 'hoch'
    .. hier sicher Ihre Aufgaben erledigen  
    })

(Optional kann ein zweites Argument mit dem Modus hinzugefügt werden.)


Weitere Gedanken:

  1. Sie könnten then oder await verwenden, indem Sie das native promisify verwenden.

    const util = require('util'), fs = require('fs');
    const mkdir = util.promisify(fs.mkdir);
    var myFunc = () => { ..etwas machen.. } 
    
    mkdir('/path')
        .then(myFunc)
        .catch(err => { if (err.code != 'EEXIST') throw err; myFunc() })
  2. Sie können Ihre eigene Promise-Methode erstellen, so etwas wie (nicht getestet):

    let mkdirAsync = (path, mode) => new Promise(
       (resolve, reject) => mkdir (path, mode, 
          err => (err && err.code !== 'EEXIST') ? reject(err) : resolve()
          )
       )
  3. Für synchrone Überprüfungen können Sie verwenden:

    fs.existsSync(path) || fs.mkdirSync(path)
  4. Oder Sie können eine Bibliothek verwenden, die beiden beliebtesten sind

    • mkdirp (erstellt nur Ordner)
    • fsextra (erweitert fs, fügt viele nützliche Funktionen hinzu)

19voto

WasiF Punkte 20540

Einzellösung: Erstellt das Verzeichnis, wenn es nicht existiert

// import
const fs = require('fs')  // In JavaScript
import * as fs from "fs"  // in TypeScript
import fs from "fs"       // in Typescript

// Verwendung
!fs.existsSync(`./assets/`) && fs.mkdirSync(`./assets/`, { recursive: true })

12voto

Abdul Vajid Punkte 1201

Die beste Lösung wäre, das npm-Modul namens node-fs-extra zu verwenden. Es verfügt über eine Methode namens mkdir, die das Verzeichnis erstellt, von dem du gesprochen hast. Wenn du einen langen Verzeichnispfad angibst, werden automatisch die übergeordneten Ordner erstellt. Das Modul ist eine Erweiterung des npm-Moduls fs, sodass du alle Funktionen in fs nutzen kannst, wenn du dieses Modul hinzufügst.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X