os.Link în Go

Creează o legătură hard: un al doilea nume pentru același fișier de pe disc.

Sintaxă
func Link(oldname, newname string) error

Ce face os.Link

os.Link face ca fișierul existent oldname să fie accesibil și ca newname, ca ln (fără -s). Ambele nume arată spre aceleași date: o modificare prin unul se vede și prin celălalt.

Datele rămân pe disc cât timp există cel puțin un nume. Legăturile hard funcționează doar pe aceeași partiție și, de obicei, nu pentru directoare. Pentru o scurtătură care poate arăta oriunde, folosește os.Symlink.

Parametri

Parametru Descriere
oldname Fișierul existent.
newname Numele nou (nu trebuie să existe).

Ce returnează

nil la succes sau o eroare *os.LinkError.

Exemple

Exemplul 1: Două nume, aceleași date

package main

import (
    "fmt"
    "os"
)

func main() {
    os.WriteFile("lista.txt", []byte("pâine\n"), 0o644)
    if err := os.Link("lista.txt", "cumparaturi.txt"); err != nil {
        fmt.Println("eroare:", err)
        return
    }

    f, _ := os.OpenFile("lista.txt", os.O_APPEND|os.O_WRONLY, 0)
    f.WriteString("lapte\n")
    f.Close()

    date, _ := os.ReadFile("cumparaturi.txt")
    fmt.Print(string(date))

    a, _ := os.Stat("lista.txt")
    b, _ := os.Stat("cumparaturi.txt")
    fmt.Println("același fișier:", os.SameFile(a, b))
}

Rezultat

pâine
lapte
același fișier: true

Exemplul 2: Ștergerea unui nume

Datele rămân accesibile prin celălalt nume.

package main

import (
    "fmt"
    "os"
)

func main() {
    os.WriteFile("original.txt", []byte("date importante"), 0o644)
    os.Link("original.txt", "copie-hard.txt")
    os.Remove("original.txt")

    date, err := os.ReadFile("copie-hard.txt")
    fmt.Println(string(date), err)
}

Rezultat

date importante <nil>

Greșeli frecvente

  • Crezi că legătura hard este o copie. Nu este: modificările se văd prin ambele nume.
  • Încerci o legătură hard între discuri diferite sau spre un director; primești eroare. Folosește os.Symlink.

Comenzi înrudite

  • os.Symlink: Creează o legătură simbolică (scurtătură) spre alt fișier; Readlink citește spre ce arată.
  • os.SameFile: Spune dacă două FileInfo descriu același fișier de pe disc, chiar dacă au căi diferite.
  • os.Rename: Redenumește sau mută un fișier ori un director.