mkdir indien niet bestaat met gebruik van golang

Ik ben golang aan het leren (beginner) en ik heb gezocht op zowel google als stackoverflow, maar ik kon geen antwoord vinden, dus excuseer me als het al gevraagd is, maar hoe kan ik mkdir gebruiken als het niet in golang bestaat.

In node zou ik bijvoorbeeld fs-extra gebruiken met de functie ensureDirSync(als blokkeren natuurlijk geen probleem is)

fs.ensureDir("./public");

Antwoord 1, autoriteit 100%

Ok, ik ben erachter gekomen dankzij deze vraag/antwoord

import(
    "os"
    "path/filepath"
)
newpath := filepath.Join(".", "public")
err := os.MkdirAll(newpath, os.ModePerm)
// TODO: handle error

Relevant Go-document voor MkdirAll:

MkdirAllmaakt een map met de naam pad,
samen met eventuele noodzakelijke ouders, en retourneert nihil,
of geeft anders een fout terug.

Als pad al een map is, doet MkdirAll niets
en geeft nul terug.


Antwoord 2, autoriteit 95%

Ik ben twee manieren tegengekomen:

  1. Controleer of de directory bestaat en maak deze aan als deze niet bestaat:

    if _, err := os.Stat(path); os.IsNotExist(err) {
        err := os.Mkdir(path, mode)
        // TODO: handle error
    }
    

Dit is echter onderhevig aan een raceconditie: het pad kan door iemand anders zijn gemaakt tussen de os.Stat-aanroep en de os.Mkdir-aanroep.

p>

  1. Probeer de directory aan te maken en eventuele problemen te negeren (het negeren van de fout wordt niet aanbevolen):

    _ = os.Mkdir(path, mode)
    

Antwoord 3, autoriteit 4%

Je kunt os.Statgebruiken om te controleren als een bepaald pad bestaat.
Als dit niet het geval is, kunt u os.Mkdirgebruiken om maak het.


Antwoord 4, autoriteit 3%

Dit is een alternatief om hetzelfde te bereiken, maar het voorkomt racecondities die worden veroorzaakt door twee verschillende “check ..en.. create”-bewerkingen.

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 {
        return nil
    }
    if os.IsExist(err) {
        // check that the existing path is a directory
        info, err := os.Stat(dirName)
        if err != nil {
            return err
        }
        if !info.IsDir() {
            return errors.New("path exists but is not a directory")
        }
        return nil
    }
    return err  
}

Antwoord 5

Dus wat ik heb gevonden om voor mij te werken is:

//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)
}

Ik hou van de draagbaarheid hiervan.


Antwoord 6

Of u kunt proberen het bestand te maken en te controleren of de geretourneerde fout geen “bestand bestaat”-fout is

if err := os.Mkdir(path, mode); err != nil && !os.IsExist(err) {
    log.Fatal(err)
}

Other episodes