Introdução: Por que trabalhar com o sistema de arquivos em Swift é importante
Qualquer aplicativo iOS ou macOS, mais cedo ou mais tarde, enfrenta a necessidade de salvar dados no dispositivo do usuário. Seja para cache de imagens, download de documentos ou salvamento de configurações — trabalhar com o sistema de arquivos em Swift é uma habilidade fundamental para todo desenvolvedor. Neste artigo, vamos explorar na prática como usar FileManager, trabalhar com diretórios, ler e escrever arquivos, além de gerenciar seus atributos. Você receberá exemplos de código prontos que podem ser aplicados imediatamente no seu projeto.
Ferramentas principais: FileManager e URL
A classe central para trabalhar com o sistema de arquivos em Swift é FileManager. Ela fornece uma interface unificada para interagir com o sistema de arquivos tanto no iOS quanto no macOS. O segundo componente chave é URL, que é usado para especificar caminhos para arquivos e diretórios.
Obtendo diretórios padrão
A primeira coisa que você precisa saber é como obter os caminhos para os diretórios do sistema: Documents, Library, Caches e Temporary. Veja como fazer:
import Foundation
let fileManager = FileManager.default
// Diretório Documents — para dados do usuárioguard let documentsURL = fileManager.urls(for: .documentDirectory, in: .userDomainMask).first else { fatalError("Falha ao obter o diretório Documents")}print("Documents: \\(documentsURL.path)")
// Diretório Caches — para dados temporários em cachelet cachesURL = fileManager.urls(for: .cachesDirectory, in: .userDomainMask).first!print("Caches: \\(cachesURL.path)")
// Diretório temporário — para arquivos que podem ser excluídos a qualquer momentolet tempURL = fileManager.temporaryDirectoryprint("Temp: \\(tempURL.path)")Importante: No iOS, um aplicativo só pode gravar dados em sua própria sandbox. O acesso a arquivos do sistema ou arquivos de outros aplicativos é proibido.
Criação, leitura e escrita de arquivos
Agora vamos para as operações práticas. Vamos ver como criar arquivos, escrever dados neles e lê-los de volta.
Escrevendo dados em um arquivo
A maneira mais simples é usar o método write(to:) para strings ou Data. Mas para maior confiabilidade, sempre use tratamento de erros:
let documentsURL = fileManager.urls(for: .documentDirectory, in: .userDomainMask).first!let fileURL = documentsURL.appendingPathComponent("example.txt")
let content = "Hello, Swift! Este é um arquivo de teste."
do { try content.write(to: fileURL, atomically: true, encoding: .utf8) print("Arquivo criado com sucesso: \\(fileURL.lastPathComponent)")} catch { print("Erro ao escrever: \\(error.localizedDescription)")}Lendo dados de um arquivo
A leitura é feita de forma similar — usando o construtor String(contentsOf:) ou métodos de Data:
do { let savedContent = try String(contentsOf: fileURL, encoding: .utf8) print("Conteúdo do arquivo: \\(savedContent)")} catch { print("Erro ao ler: \\(error.localizedDescription)")}Trabalhando com dados binários (imagens, arquivos)
Para arquivos binários, use o tipo Data:
// Escrevendo dados binárioslet imageData = UIImage(named: "example.png")?.pngData()let imageURL = documentsURL.appendingPathComponent("image.png")
do { try imageData?.write(to: imageURL)} catch { print("Erro ao escrever imagem: \\(error)")}
// Lendo dados bináriosif let loadedData = try? Data(contentsOf: imageURL) { let loadedImage = UIImage(data: loadedData) print("Imagem carregada: \\(loadedImage != nil)")}Gerenciamento de diretórios e arquivos
Apenas escrever e ler não é suficiente. Frequentemente é necessário criar subdiretórios, mover, copiar ou excluir