Como contar arquivos em uma pasta usando ASP (FSO)

Na intranet de um cliente existe um módulo para distribuição de arquivos para os clientes dele, para isso eu utilizo o File System Object (FSO), que navega pelas pastas especificadas do sistema (onde meu cliente sobe diversos arquivos por FTP), identifica os arquivos e distribui cada arquivo para o respectivo usuário final (o cliente do meu cliente).

Com poucos arquivos a distribuição acontece tranquilamente, os arquivos são movidos para a pasta de cada usuário, cada usuário recebe uma notificação por e-mail com o link para a área de login do sistema com acesso aos arquivos. Porém todo o servidor tem um limite para execução de scripts e muitas vezes simplesmente aumentar esse limite de tempo de execução não é recomendável, pois se alguma coisa der errado (como um loop infinito) vai ficar sobrecarregndo o servidor.

New Folder

Isso sim é organizar os documentos em pastas

 

Começaram a acontecer problemas quando existiam muitos arquivos para mover, pois além da listagem de todos os arquivos o sistema segue uma lógica para identificar de qual usuário é cada arquivo para que a distribução seja feita de forma correta.

A solução para não retornar o erro de limite de tempo excedido e não aumentar loucamente este limite (o usuário certamente vai achar que deu erro quando uma página demorar demais para carregar) foi limitar o número de arquivos movimentados por vez, isso permite dar um feedback entre a "paginação" evitando que o usuário pense que o aplicativo travou ou deu erro e clique repetidamente em botões da interface. Eles gostam disso.

Segue uma parte da solução que adotei.

 

Como contar quantos arquivos tem em uma pasta utilizando o FSO?

Quando procurei informações de como contar quantos arquivos existiam em uma pasta a maioria envolvia um loop por todos os arquivos, e isso me lembrou minha experiência com POG: Não programe isso!

Twittei para ver se alguém conhecia uma solução melhor do que um loop, @chrisloki@cleiverrr e @alinedecampos responderam com idéias/sugestões, não achei nenhuma documentação completa do FSO (ok, só dei uma googleada básica) mas resolvi testar algumas coisas como UBound (para pegar o índica mais alto de uma array) e depois um count.

O UBound não funciona, o array de arquivos não pode ser tratado como um normal, mas existe o comando COUNT no FSO, segue abaixo o script para contar quantos arquivos existem em uma pasta:

 

dirtowalk = "../web_users/gssolutions/arquivos/"

Set fs = CreateObject("Scripting.FileSystemObject")

Set f = fs.GetFolder(server.mappath(dirtowalk))

Set fc = f.Files

total = fc.count

response.write "Total de arquivos na pasta " & dirtowalk & ": " & total

 

É isso aí, um simples .count no "array" de arquivos retorna o número de arquivos dentro da pasta. Caso existam subpastas, você teria que criar um loop para ir navegando e somando os arquivos dentro de cada subpasta…

Mais funcional e elegante do que um "For Each arquivo In fc"!

Obrigado a todos os que ajudaram e responderam meus pedidos de socorro no twitter, espero ter ajdado também! 🙂