# 7.5 Archivos Los archivos son objetos esenciales en cada computador. No es una sorpresa que las aplicaciones web también hagan un uso de ellos. En esta sección vamos a aprender cómo operar archivos en Go. ## Directorios En Go, la mayoría de las operaciones de archivos están localizadas en el paquete `os`. Aquí hay algunas de las funciones: - `func Mkdir(name string, perm FileMode) error` Crea un directorio `name` y los permisos `perm`, ejemplo: 0777. - `func MkdirAll(path string, perm FileMode) error` Crea múltiples directorios de acuerdo al `path`, como `astaxie/test1/test2`. - `func Remove(name string) error` Elimina el directorio `name`. Retorna un error si no hay directorio o no está vacío. - `func RemoveAll(path string) error` Elimina múltiples directorios de acuerdo al `path`. Los directorios no serán eliminados si `path` es una ruta simple. Código de ejemplo: ``` package main import ( "fmt" "os" ) func main() { os.Mkdir("astaxie", 0777) os.MkdirAll("astaxie/test1/test2", 0777) err := os.Remove("astaxie") if err != nil { fmt.Println(err) } os.RemoveAll("astaxie") } ``` ## Archivos ### Crear y abrir archivos Existen dos funciones para crear archivos: - `func Create(name string) (file *File, err Error)` Crea un archivo `name` y retorna un objeto de lectura escritura con los permisos 0666. - `func NewFile(fd uintptr, name string) *File` Crea un archivo y retorna un retorna un objeto archivo. También hay dos funciones para abrir archivos: - `func Open(name string) (file *File, err Error)` Abre un archivo `name` con permisos de solo lectura, llamando a `OpenFile` por debajo. - `func OpenFile(name string, flag int, perm uint32) (file *File, err Error)` Abre un archivo `name`. `flag` es el modo de abertura, como solo lectura, lectura-escritura, etc. `perm` son los permisos del archivo. ### Escribir archivos Funciones para escribir archivos: - `func (file *File) Write(b []byte) (n int, err Error)` Escribr contenido binario a un archivo. - `func (file *File) WriteAt(b []byte, off int64) (n int, err Error)` Escribe un archivo binario en una posición específica del archivo. - `func (file *File) WriteString(s string) (ret int, err Error)` Escribe una cadena en un archivo. Código de ejemplo: ``` package main import ( "fmt" "os" ) func main() { userFile := "astaxie.txt" fout, err := os.Create(userFile) if err != nil { fmt.Println(userFile, err) return } defer fout.Close() for i := 0; i < 10; i++ { fout.WriteString("Just a test!\r\n") fout.Write([]byte("Just a test!\r\n")) } } ``` ### Read files Funciones para leer archivos: - `func (file *File) Read(b []byte) (n int, err Error)` Lee la información a `b` - `func (file *File) ReadAt(b []byte, off int64) (n int, err Error)` Lee l ainformación de `off` a `b` Código de ejemplo: ``` package main import ( "fmt" "os" ) func main() { userFile := "asatxie.txt" fl, err := os.Open(userFile) if err != nil { fmt.Println(userFile, err) return } defer fl.Close() buf := make([]byte, 1024) for { n, _ := fl.Read(buf) if 0 == n { break } os.Stdout.Write(buf[:n]) } } ``` ### Eliminar archivos Go usa la misma función para eliminar archivos y directorios: - `func Remove(name string) Error` Elimina un archivo o directorio `name` (***si termina en `/` significa que es un directorio***) ## Enlaces - [Índice](preface.md) - Sección previa: [Plantillas](07.4.md) - Siguiente sección: [Cadenas](07.6.md)