Lidar com arquivos em um sistema pode parecer simples à primeira vista. Será?
Certa vez, faz alguns anos, um cliente acionou o suporte técnico informando que os usuários do seu sistema não conseguiam mais carregar arquivos.
Os logs de exceções foram avaliados, não havia nenhuma alteração no hardware, última versão estável do sistema no ar faz algumas semanas, enfim, tudo aparentemente normal. Até que se decidiu dar uma olhadinha no local onde os arquivos estavam sendo gravados... juntos. Um pouco mais de 60 mil arquivos numa mesma pasta. Em um disco formatado em FAT32. :O
Entenda: o sistema permitia ao usuário carregar seus arquivos e compartilhá-los com outros usuários. Não importa qual fosse o arquivo carregado, ele sempre era salvo na mesma pasta. Avatar do usuário: na pasta. Imagens das férias do usuário: na mesma pasta. Arquivos da reunião de divulgação do balanço: na mesma pasta. Cada arquivo ao ser carregado ganhava um ID único e era formalmente renomeado para ele (mantendo a extensão).
Se você já tentou abrir uma pasta no Explorer contendo 60 mil arquivos você deve saber que, quando você tem sorte, o sistema operacional não trava. Não que você consiga mesmo visualizar os arquivos, mas pelo menos, você terá chance de matar o processo do sistema operacional e começar outra vez.
Não é saudável, nem do ponto de construção de um sistema, nem do ponto de administração humana, configurar um sistema desta forma. Imagine se um administrador tivesse de apagar alguns arquivos manualmente? Estou falando de 60 mil arquivos numa mesma pasta mas e se fossem 600 mil ou um milhão (em uma partição não FAT, claro)? Imagine se o Flickr guardasse as fotos dos usuários num esquema desses? :)
O mais prático mesmo é desenvolver este tipo de funcionalidade já pensando em uma estratégia de distribuição organizada dos arquivos. Claro, não é todo sistema que vai lidar com milhares de arquivos ou milhões mas, sinceramente, o esforço de desenvolvimento não aumenta muito pelos benefícios que se obtêm:
Vou citar um exemplo real pra você entender o que quero dizer com estratégia de distribuição organizada de arquivos:
-
As lojas de música que você encontra na internet recebem conteúdo, na forma digital de cds e músicas, de várias gravadoras (EMI, Warner, Sony, Universal, etc). A gravadora disponibiliza um FTP e a loja continuamente vai baixando e disponibilizando este "catálogo" para os clientes.
-
Normalmente você encontra nestas lojas pelo menos duas versões de qualidade para cada música: uma versão gratuita de apenas 30 segundos em 32Kb e, se você comprar, uma versão completa da música em qualidade 192 Kb.
-
Cada "qualidade" é um arquivo diferente. Se cada cd tiver 10 músicas, a loja terá de armazenar 20 arquivos. 20 arquivos vezes, sei lá, um catálogo pequeno de 100 mil cds e a loja acaba armazenando dois milhões de arquivos.
-
Cada cd possui um código internacional de 13 dígitos, o UPC (ou Digital UPC), que é um tipo de código de barras. Para facilitar a entrega, algumas gravadoras quebram esse UPC em pedaços criando uma estrutura de diretórios e disponibilizando os arquivos no final. Por exemplo, se o UPC de um cd é 0724382975229, os arquivos estarão disponíveis em 0\72\43\82\97\52\29\.
-
Uma vez que cada UPC é dito único, ao invés de ter uma única pasta com todos os cds, tem-se uma distribuição mais capilarizada. Conforme vai-se navegando pela estrutura o número de pastas vai aumentando, porém, de forma mais adequada. Imagine se a gravadora colocasse na raiz do FTP as 100 mil pastas referentes aos cds disponibilizados?
Uma outra abordagem possível é utilizar o timestamp da hora de gravação do arquivo e salvá-lo numa estrutura que respeite este timestamp. Por exemplo, se o arquivo foi carregado às "11/01/2009 18:15", ele poderia ser salvo numa estrutura como em 2009\01\11\18\15.
Há outras abordagens mais genéricas que possibilitam lidar com um volume MUITO grande de arquivos mas acredito que o ponto principal é que se deve ter uma abordagem. :) Lidar com arquivos é uma tarefa simples desde que seja pensada desde o início para mantê-la simples. Corrigir isto depois dá mais trabalho.