Dateikopie in Go: Mehr als die Grundlagen
Die Einfachheit des Dateikopierens in Go kann irreführend sein. Während die Funktion os.Link() eine vermeintlich effiziente Methode bereitstellt, erfordern ihre Einschränkungen einen umfassenderen Ansatz.
Link() Macken
Os.Link() erstellt eine feste Verbindung zwischen zwei Dateien, wodurch der Overhead der Byteübertragung vermieden wird. Dieser Ansatz weist jedoch inhärente Einschränkungen auf. Verschiedene Betriebssysteme legen unterschiedliche Einschränkungen für Hardlinks fest. In bestimmten Szenarien können Link()-Aufrufe fehlschlagen.
Robuste Dateikopie
Für eine robuste und effiziente Kopie werden die folgenden Schritte empfohlen:
In einigen Fällen bevorzugen Sie möglicherweise separate Funktionen für synchrones (blockierendes) und asynchrones (nicht blockierendes) Kopieren.
Optimiertes Beispiel
Das folgende Code-Snippet implementiert eine umfassende Dateikopierfunktion, CopyFile(), das beinhaltet die empfohlenen Schritte:
package main import ( "fmt" "io" "os" ) // CopyFile implements a robust and efficient file copy. func CopyFile(src, dst string) (err error) { sfi, err := os.Stat(src) if err != nil { return err } if !sfi.Mode().IsRegular() { return fmt.Errorf("CopyFile: Non-regular source file %s (%q)", sfi.Name(), sfi.Mode()) } dfi, err := os.Stat(dst) if err != nil { if os.IsNotExist(err) { return nil // Destination file doesn't exist, so no copying required. } return err } if !(dfi.Mode().IsRegular()) { return fmt.Errorf("CopyFile: Non-regular destination file %s (%q)", dfi.Name(), dfi.Mode()) } if os.SameFile(sfi, dfi) { return nil // Files are identical, so no copying required. } if err = os.Link(src, dst); err == nil { return nil // Hard link succeeded. } err = copyFileContents(src, dst) return err } // copyFileContents performs a byte-wise copy of the source file to the destination file. func copyFileContents(src, dst string) error { in, err := os.Open(src) if err != nil { return err } defer in.Close() out, err := os.Create(dst) if err != nil { return err } defer func() { if err == nil { err = out.Close() } }() if _, err = io.Copy(out, in); err != nil { return err } return out.Sync() }
Diese Funktion kombiniert Effizienz, Robustheit und Handhabung für verschiedene Randfälle.
Das obige ist der detaillierte Inhalt vonWie erreicht man eine robuste und effiziente Dateikopie in Go Beyond os.Link()?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!