mkdir wenn nicht mit golang existiert


78

Ich lerne Golang (Anfänger) und habe sowohl auf Google als auch auf Stackoverflow gesucht, aber ich konnte keine Antwort finden. Entschuldigen Sie mich, wenn Sie bereits gefragt wurden, aber wie kann ich mkdir, wenn es nicht in Golang existiert.

Zum Beispiel würde ich im Knoten fs-extra mit der Funktion sureDirSync verwenden (wenn das Blockieren natürlich keine Rolle spielt )

fs.ensureDir("./public");

Antworten:


134

Ich bin auf zwei Arten gelaufen:

  1. Überprüfen Sie die Existenz des Verzeichnisses und erstellen Sie es, wenn es nicht existiert:

    if _, err := os.Stat(path); os.IsNotExist(err) {
        os.Mkdir(path, mode)
    }
    
  2. Versuchen Sie, das Verzeichnis zu erstellen und alle Probleme zu ignorieren:

    _ = os.Mkdir(path, mode)
    

30
Für alle, die sich fragen, was die Variable modeist, siehe: golang.org/pkg/os/#FileMode . Sie möchten wahrscheinlich os.ModeDirals Wert verwenden.
The Unknown Dev

4
Auch für diejenigen , über die fragen mode, könnten Sie , os.Mkdir("dirname", 0700)wenn Sie in das Verzeichnis aus dem gleichen Programm zu schreiben , in der Lage sein wollen, finden Sie diese für weitere Details.
Jairo Lozano

3
Warum ignorieren wir Probleme, wenn wir os.Mkdir () ausführen?
Giannis

@ Giannis Es wird ein Fehler auftreten, wenn es bereits vorhanden ist, was in Ordnung ist. Wahrscheinlich nicht zu empfehlen.
472084

1
Beim Erstellen eines Verzeichnisses zum Speichern von Dateien im Modus os.ModeDir. Das neue Verzeichnis verfügt nicht über genügend Berechtigungen. Ich fand nur os.ModePermfür mich gearbeitet. Welches ist gleichbedeutend mit 0777oder drwxr-xr-x. Ich denke, die Berechtigungen können etwas niedriger sein, haben es 0666aber nicht geschafft.
Justin

142

Okay, ich habe es dank dieser Frage / Antwort herausgefunden

import(
    "os"
    "path/filepath"
)

newpath := filepath.Join(".", "public")
os.MkdirAll(newpath, os.ModePerm)

MkdirAll erstellt ein Verzeichnis mit dem Namen path zusammen mit allen erforderlichen übergeordneten Elementen und gibt ein niloder ein zurück error.


5
Dies ist die beste Antwort und verwendet die stdlib. Dies ist besonders nützlich, wenn es neben os.Create verwendet wird, wo Sie möglicherweise auch Unterverzeichnisse erstellen müssen (die Verwendung filepath.Dir("path/to/file")des vollständigen Pfads zur Datei ist in meinen Augen ein guter Ansatz.
Paddie

6
Möglicherweise möchten Sie beim Aufruf von MkdirAll nach einer Fehlerantwort suchen, z. B.: `If err: = os.MkdirAll (" / somepath / ", os.ModeDir); err! = nil {fmt.Println ("Verstecktes Verzeichnis kann nicht erstellt werden.")} `
Paul A. Fortin

7

Sie können os.Statdamit überprüfen, ob ein bestimmter Pfad vorhanden ist.
Wenn dies nicht der Fall ist, können Sie es os.Mkdirzum Erstellen verwenden.


2

Dies ist eine Alternative, um dasselbe zu erreichen, aber es vermeidet Rennbedingungen, die durch zwei unterschiedliche "Prüfen .. und .. Erstellen" -Operationen verursacht werden.

package main

import (
    "fmt"
    "os"
)

func main()  {
    if err := ensureDir("/test-dir"); err != nil {
        fmt.Println("Directory creation failed with error: " + err.Error())
        os.Exit(1)
    }
    // Proceed forward
}

func ensureDir(dirName string) error {

    err := os.Mkdir(dirName, os.ModeDir)

    if err == nil || os.IsExist(err) {
        return nil
    } else {
        return err
    }
}

Während Ihr Code möglicherweise die Antwort auf die Frage liefert, fügen Sie bitte einen Kontext hinzu, damit andere eine Vorstellung davon haben, was er tut und warum er dort ist.
Theo

0

Ich habe festgestellt, dass es für mich funktioniert:

//Get the base file dir
path, err := os.Getwd()
if err != nil {
    log.Println("error msg", err)
}

//Create output path
outPath:= filepath.Join(path, "output")

//Create dir output using above code
if _, err := os.Stat(outPath); os.IsNotExist(err) {
    os.Mkdir(outPath, 0755)
}

Ich mag die Portabilität davon.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.