Introdução
\nTrabalhar com o sistema de arquivos é uma das tarefas essenciais no desenvolvimento de aplicativos para iOS e macOS. Independentemente de você estar escrevendo um aplicativo para salvar dados do usuário, armazenar imagens em cache ou exportar documentos, entender os fundamentos do trabalho com arquivos em Swift é uma habilidade obrigatória. Neste artigo, abordaremos exemplos práticos de trabalho com o sistema de arquivos: criação, leitura, escrita, exclusão de arquivos e gerenciamento de diretórios.
\nA Apple fornece a poderosa API FileManager, que permite interagir com o sistema de arquivos tanto no iOS quanto no macOS. Vamos explorá-la com exemplos reais e código pronto.
1. Obtendo caminhos para diretórios do sistema
\nAntes de começar a trabalhar com arquivos, você precisa acessar os diretórios corretos. No iOS e macOS, cada aplicativo opera em uma sandbox isolada. Para armazenar dados, use os seguintes caminhos:
\n\nDiretório Documents
\nUsado para armazenar dados do usuário que devem ser preservados durante atualizações do aplicativo e backups.
\nimport Foundation\n\nfunc getDocumentsDirectory() -> URL {\n let paths = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)\n return paths[0]\n}\n\n// Exemplo de uso\nlet documentsURL = getDocumentsDirectory()\nprint("Caminho Documents: \\(documentsURL.path)")\n\nDiretório Caches
\nPara arquivos temporários que podem ser recriados (por exemplo, cache de imagens).
\nfunc getCachesDirectory() -> URL {\n let paths = FileManager.default.urls(for: .cachesDirectory, in: .userDomainMask)\n return paths[0]\n}\n\nDiretório Library/Application Support
\nPara armazenar dados que não devem ser acessíveis diretamente pelo usuário, mas que devem ser preservados.
\nfunc getApplicationSupportDirectory() -> URL {\n let paths = FileManager.default.urls(for: .applicationSupportDirectory, in: .userDomainMask)\n let directory = paths[0]\n // Garantir que o diretório exista\n try? FileManager.default.createDirectory(at: directory, withIntermediateDirectories: true)\n return directory\n}\n\n2. Criando e escrevendo arquivos
\nAgora que sabemos onde armazenar arquivos, vamos aprender a criá-los e escrever dados.
\n\nEscrevendo dados de texto
\nA maneira mais simples é usar o método write(to:) de uma string ou Data.
func writeTextFile() {\n let fileName = "example.txt"\n let documentsURL = getDocumentsDirectory()\n let fileURL = documentsURL.appendingPathComponent(fileName)\n \n let content = "Olá, Swift! Este é um arquivo de teste."\n \n do {\n try content.write(to: fileURL, atomically: true, encoding: .utf8)\n print("Arquivo criado com sucesso: \\(fileURL.path)")\n } catch {\n print("Erro ao escrever arquivo: \\(error.localizedDescription)")\n }\n}\n\nEscrevendo dados binários (imagens, JSON)
\nPara trabalhar com dados binários, use Data.
func writeJSONFile() {\n let fileName = "data.json"\n let documentsURL = getDocumentsDirectory()\n let fileURL = documentsURL.appendingPathComponent(fileName)\n \n let dictionary: [String: Any] = [\n "name": "Desenvolvedor Swift",\n "age": 30,\n "skills": ["iOS", "macOS", "SwiftUI"]\n ]\n \n do {\n let jsonData = try JSONSerialization.data(withJSONObject: dictionary, options: .prettyPrinted)\n try jsonData.write(to: fileURL, options: .atomic)\n print("Arquivo JSON salvo")\n } catch {\n print("Erro: \\(error)")\n }\n}\n\nCriando diretórios
\nÀs vezes, é necessário criar subpastas para organizar arquivos.
\nfunc createSubdirectories() {\n let documentsURL = getDocumentsDirectory()\n let subDirURL = documentsURL.appendingPathCo