Go:
Sprawdzanie, czy katalog istnieje

Jak to zrobić:

W Go pakiet os oferuje funkcjonalności do interakcji z systemem operacyjnym, w tym sprawdzanie, czy katalog istnieje. Oto jak można to zrobić:

package main

import (
    "fmt"
    "os"
)

// isDirExists sprawdza, czy katalog istnieje
func isDirExists(path string) bool {
    info, err := os.Stat(path)
    if os.IsNotExist(err) {
        return false
    }
    return info.IsDir()
}

func main() {
    dirPath := "/tmp/exampleDir"

    if isDirExists(dirPath) {
        fmt.Printf("Katalog %s istnieje.\n", dirPath)
    } else {
        fmt.Printf("Katalog %s nie istnieje.\n", dirPath)
    }
}

Przykładowe wyjście:

Katalog /tmp/exampleDir istnieje.

lub

Katalog /tmp/exampleDir nie istnieje.

W zależności od tego, czy /tmp/exampleDir istnieje.

Dogłębna analiza

Funkcja os.Stat zwraca interfejs FileInfo oraz błąd. Jeśli błąd jest typu os.ErrNotExist, oznacza to, że katalog nie istnieje. Jeśli nie ma błędu, dalej sprawdzamy, czy ścieżka rzeczywiście odnosi się do katalogu, za pomocą metody IsDir() z interfejsu FileInfo.

Ta metoda wyróżnia się swoją prostotą i skutecznością, ale ważne jest, aby zauważyć, że sprawdzanie istnienia katalogu przed wykonaniem operacji takich jak tworzenie czy zapisywanie może prowadzić do warunków wyścigu w środowisku współbieżnym. W wielu scenariuszach, szczególnie w aplikacjach współbieżnych, bezpieczniej może być próbować wykonać operację (np. tworzenie pliku) i radzić sobie z błędami po fakcie, zamiast sprawdzać to na wstępie.

Historycznie, to podejście było powszechne w programowaniu z powodu jego prostej logiki. Jednak ewolucja obliczeń wielowątkowych i współbieżnych wymaga przesunięcia w kierunku bardziej solidnego radzenia sobie z błędami i unikania sprawdzania warunków wstępnych tam, gdzie to możliwe. Nie umniejsza to jednak jego użyteczności dla prostszych, jednowątkowych aplikacji lub skryptów, gdzie takie warunki są mniej problematyczne.