Lees bestandsinformatie in Golang
In dit artikel gaan we bestanden of map gegevens uitlezen in Golang. Als het om beveiliging gaat, is het erg belangrijk om te bepalen wie de eigenaar is, wanneer was het laatst gewijzigd en of het bestand andere verborgen bestanden bevatten. Hackers zijn tegenwoordig bekend om kwaadaardige bestanden te achterlaten op je computer.
Om het bestand gegevens uit te kunnen lezen, moeten we de functie os.Stat()
gebruiken die de bestand gegevens retourneren waarop de metadata kan worden opgehaald. Dergelijke informatie wordt geleverd via zo’n FileInfo struct.
bestandGegevens, err := os.Stat("./golang/file_info/nederlands/bestands_map/bestand.txt")
if err != nil {
log.Fatal(err)
}
Nadat je de FileInfo struct heeft opgehaald, kun je alle aanvullende bestandseigenschappen ophalen. De functie Name()
retourneert de bestandsnaam.
fmt.Println("Bestand naam: ", bestandGegevens.Name())
De Size()
functie retourneert de bestandsgrootte in bytes. Om onze broncodes leesbaarder te maken, hebben we een extra functie geimplementeerd om de bestandsgrootte in de vorm van een tekst (string) te retourneren. De functie berekent de bestandsgrootte m.b.v. van de FileInfo struct en retourneert het in bytes, kilobytes of megabytes.
func bestandsGrootteOphalen(bestandGegevens fs.FileInfo) string {
bestandsGrootte := bestandGegevens.Size()
if bestandsGrootte < 1000 { // Bestandsgrootte is in bytes
return fmt.Sprintf("%d bytes", bestandsGrootte)
} else { // bestandsgrootte is in kilobytes of megabytes
bestandsGrootteInKb := float64(bestandsGrootte) / float64(1000)
if bestandsGrootteInKb > 1000 { // bestandsgrootte is in megabytes
bestandsGrootteInMb := bestandsGrootteInKb / float64(1000)
return fmt.Sprintf("%d Mb", bestandsGrootteInMb)
} else { // bestandsgrootte is in kilobytes
return fmt.Sprintf("%d Kb", bestandsGrootteInKb)
}
}
}
Om de bestands rechten te bepalen, kan de Mode()
functie gebruikt worden. De functie retourneert een FileMode struct die de modus en rechten bits bevatten. Niet alle bits zijn toepasbaar op alle besturingssystemen.
fmt.Println("Rechten: ", bestandGegevens.Mode())
Voor de metadata van de laatste wijziging kan ModTime()
gebruikt worden die een Time struct terug sturen.
fmt.Println("Laatst gewijzigd: ", bestandGegevens.ModTime())
Naast de bestandsGrootteOphalen
is er nog een andere die bepaald of een bestand een map is of niet. Dit functie geef de tekst ja of nee terug.
func isEenMap(bestandGegevens fs.FileInfo) string {
var resultaat = "Nee"
if bestandGegevens.IsDir() {
resultaat = "Ja"
}
return resultaat
}
Het resultaat van dit simpel Go applicatie leidt als volgt:
fmt.Println("|----------- Bestand gegevens -----------|")
fmt.Println("Bestand naam: ", bestandGegevens.Name())
fmt.Println("Bestand grootte: ", bestandsGrootteOphalen(bestandGegevens))
fmt.Println("Rechten: ", bestandGegevens.Mode())
fmt.Println("Laatst gewijzigd: ", bestandGegevens.ModTime())
fmt.Println("Is een map: ", isEenMap(bestandGegevens))
fmt.Println("|----------- Bestand gegevens -----------|\n")
Er is nog een voorbeeld toegevoegd, maar hier gaat het om een map:
mapGegevens, err := os.Stat("./golang/file_info/nederlands/bestands_map")
if err != nil {
log.Fatal(err)
}
fmt.Println("|----------- Map gegevens -----------|")
fmt.Println("Bestand naam: ", mapGegevens.Name())
fmt.Println("Bestand grootte: ", bestandsGrootteOphalen(mapGegevens))
fmt.Println("Rechten: ", mapGegevens.Mode())
fmt.Println("Laatst gewijzigd: ", mapGegevens.ModTime())
fmt.Println("Is een map: ", isEenMap(mapGegevens))
fmt.Println("|----------- Map gegevens -----------|")
Programma resultaat:
|----------- Bestand gegevens -----------|
Bestand naam: bestand.txt
Bestand grootte: 23 bytes
Rechten: -rw-r--r--
Laatst gewijzigd: 2022-01-11 19:36:13.962403306 -0400 AST
Is een map: Nee
|----------- Bestand gegevens -----------|
|----------- Map gegevens -----------|
Bestand naam: bestands_map
Bestand grootte: 96 bytes
Rechten: drwxr-xr-x
Laatst gewijzigd: 2022-01-11 19:36:13.962481158 -0400 AST
Is een map: Ja
|----------- Map gegevens -----------|
Zie onze GitHub repository voor de broncode van het project en kloon onze repository voor alle toekomstige projecten.
Volg ons:
Everything is very open with a precise clarification of the issues. It was truly informative. Your site is extremely helpful. Many thanks for sharing!