Não é rara a necessidade de manipular arquivos de um site através de código, pelo contrário : Quer seja para permitir um fácil gerenciamento dos arquivos através do browser, quer seja para exibir ao usuário uma lista de arquivos disponíveis (para download, por exemplo) ou gerenciar locais para upload, a manipulação de arquivos via código ASP se torna uma necessidade cada vez mais frequente.

Existe um conjunto de objetos da Microsoft conhecidos como FileSystemObject. Esse conjunto de objetos nos permite fazer a manipulação de arquivos existentes em um site Web.

O FileSystemObject é um objeto COM. Uma forma interessante de estudar este tipo de objeto é utilizando o próprio VB. No VB podemos fazer referencia a este objeto através do menu project > References, marcando a opção "Microsoft Scripting Runtime". Feita a referencia o Object Browser do VB nos permite visualizar todos os detalhes dos objetos disponíveis no FileSystemObject. Isso nos permite estudar e explorar todo seu potencial.

Vejamos então como fazer uma listagem dos arquivos contidos em nosso site.

O FileSystemObject possui um objeto principal denominado "FileSystemObject" que devemos utilizar para acessar outros objetos (pastas, arquivos, etc.). Para podermos listar o conteúdo de uma pasta precisaremos obter o objeto pasta e acessar seus arquivos. Assim sendo precisaremos de 3 variáveis : FSO, PASTA, ARQ

Nosso código será construido em uma página chamada Arquivos.ASP :


<%
   dim fso,arq,pasta
   set fso=createobject("scripting.filesystemobject")
%>

O único objeto que instanciamos é o FileSystemObject, os demais obteremos a partir do FileSystemObject. A pasta, por exemplo : Deveremos utilizar o método GetFolder no objeto FSO indicando qual pasta desejamos. O GetFolder exige que passemos um caminho físico, portanto deveremos usar o Server.MapPath para converter a raiz do site em caminho físico, veja :


<%
   dim fso,arq,pasta
   set fso=createobject("scripting.filesystemobject")
   set pasta=fso.getfolder(server.mappath("/")) 
%>

O objeto Folder, que agora encontra-se na variável Pasta, possui uma coleção chamada Files que contém todos os arquivos da referida pasta. Podemos percorrer esta coleção com um For/Each para fazer a exibição dos nomes dos arquivos, veja :


<%
 dim fso,arq,pasta
set fso=createobject("scripting.filesystemobject")
 set pasta=fso.getfolder(server.mappath("/")) 
 For Each arq in fso.Files
response.write(arq.name & "
")
next
 %>

Este script já pode ser testando, irá listar o nome de todos os arquivos contidos em uma pasta.

Vamos acrescentar mais funcionalidade : Vamos criar um botão "Deletar" que permita que o usuário elimine um registro. O botão precisará ser um botão de submit de um form para realizar a transmissão do nome do arquivo. O nome do arquivo, por sua vez, precisará estar oculto neste form (campo hidden) para que possa ser recuperado pela rotina de deleção.

Vamos criar uma tabela para que a disposição dos nomes de arquivos e do botão "deletar" fique minimamente aceitável.


<%
 dim fso,arq,pasta
set fso=createobject("scripting.filesystemobject")
 set pasta=fso.getfolder(server.mappath("/")) 
%>
 

<% 
for each arq in pasta.files %>
<%

next

%>

O Action, arquivos.ASP, é o mesmo arquivo no qual estamos produzindo este código. Então no inicio do arquivo devemos verificar se já ocorreu o POST e, se ocorreu, devemos deletar o arquivo que foi recebido como parâmetro.

O FSO possui o método DeleteFile que podemos utilizar para deletar um arquivo. Precisaremos informar todo o path do arquivo, mas será fácil montar isso através do objeto Folder (pasta).

Precisaremos também, claro, de um tratamento de erro. Além disso usaremos a variável content_length para identificar o POST. Veja como fica :


<%
dim fso,arq,pasta
set fso=createobject("scripting.filesystemobject")
set pasta=f.getfolder(server.mappath("/"))
if request.servervariables("content_length")<>0 then
on error resume next
fso.deletefile pasta.path & "\" & request.form("txtarquivo")
if err.number<>0 then
response.write("Erro ao deletar o arquivo")
else
response.write("Arquivo deletado")
end if
on error goto 0
end if %>


<%
response.write(arq.name) %>

">
        
<% 
for each arq in pasta.files %>
<%
next
%>

Para acrescentarmos uma pergunta de confirmação para o usuário precisaremos programar em JavaScript, já que o ASP não trabalha no client e desta forma não pode, por exemplo, fazer mensagens popup.

Acrescentar a confirmação em JS é bem simples : Basta inserirmos o evento onsubmit do form chamando o método confirm do objeto windows. Apenas precisamos alterar a declaração do form, veja como ela fica :

A esta altura você já deve estar preocupado com a segurança da sua aplicação : Como garantir que qualquer um não possa entrar nesta página e deletar um arquivo? Ou como garantir que qualquer um não possa deletar um arquivo?

Bem, existem 2 possibilidades :

  1. Para um arquivo ser deletado é necessário que o usuário utilizado pelo IIS tenha permissão para isso e o mesmo acontece para acessar as páginas ASP. Essa permissão é controlada através da segurança NTFS mantida pelo próprio windows NT/2000. Você pode retirar a permissão de acesso do usuário do IIS deste arquivo (arquivos.asp). Então quando tentar acessá-lo o Internet Explorer pedirá um nome e senha de acesso, em geral seu nome e senha de FTP funcionam. Desta forma só você poderá acessar esta página e só você terá permissão para deletar arquivos.
  2. Você pode dar permissão ao usuário do IIS para deletar arquivos mas controlar via código ASP o acesso à página arquivos.asp, determinando que apenas determinado usuário (você, claro) possa acessar esta página. É menos seguro, um hacker pode achar um furo em seu código.

Vale mencionar que a configuração de permissões NTFS deverá ser feita pelo provedor de hospedagem


<%
response.write(arq.name) %>
">

Confira também