Introdução ao trabalho com o sistema de arquivos em Swift
O desenvolvimento para iOS e macOS frequentemente requer interação com o sistema de arquivos do dispositivo. Seja para salvar dados do usuário, armazenar imagens em cache ou exportar documentos — saber trabalhar com arquivos e pastas é uma habilidade obrigatória para qualquer desenvolvedor Swift. Neste artigo, vamos detalhar como usar FileManager, URL e Data para realizar todas as operações básicas com o sistema de arquivos.
Vamos abordar criação, leitura, escrita e exclusão de arquivos, bem como navegação por diretórios. Todos os exemplos de código são escritos em Swift 5 e servem tanto para projetos iOS quanto macOS.
Componentes principais: FileManager e URL
Em Swift, a classe central para trabalhar com o sistema de arquivos é FileManager. Ela fornece métodos para gerenciar arquivos, diretórios e seus atributos. Para especificar caminhos, usa-se a estrutura URL, que é uma alternativa mais segura e moderna em comparação com strings.
Obtendo diretórios padrão
A primeira coisa que você precisa saber é como obter os caminhos para os diretórios padrão do sistema. Para iOS, geralmente são Documents, Library/Caches e tmp.
import Foundation
let fileManager = FileManager.default
// Diretório Documentsguard let documentsURL = fileManager.urls(for: .documentDirectory, in: .userDomainMask).first else { fatalError("Não foi possível obter o diretório Documents")}print("Documents: \\(documentsURL.path)")
// Diretório Cachesguard let cachesURL = fileManager.urls(for: .cachesDirectory, in: .userDomainMask).first else { fatalError("Não foi possível obter o diretório Caches")}print("Caches: \\(cachesURL.path)")
// Diretório temporáriolet tempURL = fileManager.temporaryDirectoryprint("Temp: \\(tempURL.path)")Criação e escrita de arquivos
Criar um arquivo em Swift é uma combinação de criar um caminho e escrever dados. Vamos ver duas abordagens principais.
Escrita de dados de texto
func createTextFile() { guard let documentsURL = fileManager.urls(for: .documentDirectory, in: .userDomainMask).first else { return } let fileURL = documentsURL.appendingPathComponent("example.txt") let content = "Olá, mundo! Este é um arquivo de teste." do { try content.write(to: fileURL, atomically: true, encoding: .utf8) print("Arquivo criado com sucesso no caminho: \\(fileURL.path)") } catch { print("Erro ao escrever o arquivo: \\(error.localizedDescription)") }}Escrita de dados binários (imagens, arquivos)
func createBinaryFile() { guard let documentsURL = fileManager.urls(for: .documentDirectory, in: .userDomainMask).first else { return } let fileURL = documentsURL.appendingPathComponent("data.bin") let data = Data([0x48, 0x65, 0x6C, 0x6C, 0x6F]) // "Hello" em hex do { try data.write(to: fileURL, options: .atomic) print("Arquivo binário criado") } catch { print("Erro: \\(error)") }}Criação de diretórios
func createDirectory() { guard let documentsURL = fileManager.urls(for: .documentDirectory, in: .userDomainMask).first else { return } let newDirURL = documentsURL.appendingPathComponent("MyFolder") do { try fileManager.createDirectory(at: newDirURL, withIntermediateDirectories: true, attributes: nil) print("Diretório criado: \\(newDirURL.path)") } catch { print("Erro ao criar diretório: \\(error)") }}Leitura e verificação de arquivos
Depois que os arquivos são criados, é preciso saber lê-los e verificar se existem.
Verificação de existência do arquivo
func fileExists(at url: URL) -> Bool { return fileMan