Trabalhando com o sistema de arquivos em Swift: para iniciantes
Trabalhar com o sistema de arquivos é uma das tarefas principais ao desenvolver aplicativos para iOS e macOS. Seja para salvar dados do usuário, armazenar imagens em cache ou exportar documentos, você inevitavelmente precisará interagir com arquivos e pastas. Neste artigo, abordaremos as principais ferramentas do Swift para trabalhar com o sistema de arquivos, incluindo FileManager, caminhos de diretórios, criação, leitura, escrita e exclusão de arquivos. O material é voltado para desenvolvedores iniciantes, portanto, todos os exemplos serão o mais simples e claros possível.
Fundamentos: FileManager e caminhos
A principal classe para trabalhar com o sistema de arquivos em Swift é FileManager. Ela é uma abstração sobre as chamadas de sistema padrão, fornecendo uma interface conveniente para gerenciar arquivos e pastas. Na maioria das vezes, usa-se seu singleton:
let fileManager = FileManager.defaultComo os aplicativos no iOS e macOS operam em um ambiente isolado (sandbox), você precisa saber onde pode salvar dados. Os principais diretórios aos quais o aplicativo tem acesso são:
- Documents — para documentos e dados do usuário que devem ser preservados entre execuções.
- Caches — para arquivos temporários que o sistema pode excluir para liberar espaço.
- Temporary — para arquivos temporários que serão removidos na próxima reinicialização do dispositivo.
- Library/Application Support — para dados que não devem ser acessíveis diretamente pelo usuário, mas que devem ser preservados.
Você pode obter o caminho para o diretório desejado usando o método urls(for:in:):
// Obtém o caminho para a pasta Documentslet documentsURL = fileManager.urls(for: .documentDirectory, in: .userDomainMask).first!print("Caminho Documents: \\(documentsURL.path)")
// Obtém o caminho para a pasta Cacheslet cachesURL = fileManager.urls(for: .cachesDirectory, in: .userDomainMask).first!print("Caminho Caches: \\(cachesURL.path)")
// Obtém o caminho para a pasta temporárialet tempURL = fileManager.temporaryDirectoryprint("Caminho Temp: \\(tempURL.path)")Observe: o método retorna um array de URL (caso existam vários caminhos), mas para diretórios de usuário geralmente pegamos o primeiro elemento. No Swift moderno, recomenda-se usar URL em vez de caminhos de string, pois é mais seguro e conveniente.
Criação e escrita de arquivos
Agora que sabemos onde podemos salvar arquivos, vamos aprender a criá-los e escrever dados neles. Para escrever dados de texto, a maneira mais simples é usar o método write(to:atomically:encoding:) da classe String:
// Cria o caminho para o arquivo na pasta Documentslet fileURL = documentsURL.appendingPathComponent("myFile.txt")
// Texto para escreverlet content = "Olá, mundo! Este é meu primeiro arquivo em Swift."
do { // Escreve a string no arquivo try content.write(to: fileURL, atomically: true, encoding: .utf8) print("Arquivo criado com sucesso: \\(fileURL.path)")} catch { print("Erro ao escrever o arquivo: \\(error.localizedDescription)")}O parâmetro atomically: true significa que os dados serão primeiro escritos em um arquivo temporário e depois renomeados para o destino. Isso protege contra corrupção do arquivo em caso de falha. Para dados binários (por exemplo, imagens), você pode usar Data:
// Cria dados binários (por exemplo, um array de bytes)let data = Data([0x48, 0x65, 0x6C, 0x6C, 0x6F]) // "Hello" em ASCII
let binaryFileURL = documentsURL.appendingPathComponent("data.bin")
do { try data.write(to: binaryFileURL, options: .atomic) print("Arquivo binário criado")} catch { print("Erro: \\(error)")}