Como manipular arquivos

Em algum momento, muito provávelmente você irá manipular algum tipo de arquivo em seus programas. Nesse post vamos ver como criar, escrever, ler e remover arquivos em Go.

Para começar, vamos ver a forma mais simples e rápida para se criar e escrever dados em um arquivo.

data := []byte("Manipulando arquivos com Go")
if err := os.WriteFile("/tmp/aprendagolang1", data, 0644); err != nil {
    panic(err)
}

A função WriteFile do package os espera 3 argumentos. Caminho onde o arquivo será criado, o que é para escrever no arquivo e as permissões que o arquivo deve ter.

Se a permissão do arquivo não é algo importante, você pode fazer da seguinte forma:

file, err := os.Create("/tmp/aprendagolang2")
if err != nil {
    panic(err)
}
defer file.Close()

data := []byte("Manipulando arquivos com Go")
nb, err := file.Write(data) //nb == Número de Bytes
fmt.Printf("foram escritos %d bytes", nb)

Se o parâmetro da sua função vai receber for do tipo string, podemos mudar o file.Write por file.WriteString.

file, err := os.Create("/tmp/aprendagolang2")
if err != nil {
    panic(err)
}
defer file.Close()

nb, err := file.WriteString("Manipulando arquivos com Go")
fmt.Printf("foram escritos %d bytes", nb)

Ok, agora que já escrevemos, vamos ver como podemos ler esses arquivos para recuperar o conteúdo deles.

Seguindo a abordagem da escrita, vamos ver a forma mais simples para ler um arquivo inteiro.

data, err := os.ReadFile("/tmp/aprendagolang1")
if err != nil {
    panic(err)
}
fmt.Println(string(data))

Para arquivos muito grandes, essa abordagem pode não funcionar ou dar algum problema já que o arquivo será carregado inteiro para memória. Nesses casos podemos ler o arquivo por partes (chunks).

file, err := os.Open("/tmp/aprendagolang2")
if err != nil {
    panic(err)
}
defer file.Close()

reader := bufio.NewReader(file)
buf := make([]byte, 8)

for {
    nb, err := reader.Read(buf)
    if err != nil {
        if err != io.EOF {
            panic(err)
        }
        break
     }
     fmt.Print(string(buf[0:n]))
}

Como definimos em make([]byte, 8) esse código vai ler 8 bytes por vez. Caso você queira ler mais bytes por vez, é só mudar o 8 para o valor que desejar.

Por último, vamos ver como fazemos para remover um arquivo do nosso sistema.

err := os.Remove("/tmp/aprendagolang2")
if err != nil {
    panic(err)
}

Fácil, não?!

Deixem suas dúvidas nos comentários.

Até a próxima!


Subscreva

Fique por dentro de tudo o que acontece no mundo Go.

Deixe uma resposta