Objeto FileSystemObject



La función de este componente es permitir el acceso al sistema de archivos del servidor. Gracias al
objeto FileSystemObject podremos manipular ficheros de texto, directorios, ficheros genéricos y
unidades de disco desde nuestras páginas ASP.

Para instanciar un objeto FileSystemObject lo haremos de la misma forma que hacíamos con el objeto
Dictionary o que con cualquier objeto.


Set objFSO=Server.CreateObject("Scripting.FileSystemObject")
<OBJECT RUNAT="SERVER" SCOPE="PAGE" ID="objFSO"
PROGID="Scripting.FileSystemObject">
</OBJECT>



Al utilizar el objeto FileSystemObject puede ser interesante añadir una referencia a su librería de tipos
para poder hacer uso de las constantes definidas en la misma.

<!--METADATA TYPE="typelib" FILE="C:\Winnt\system32\scrrun.dll"-->


Muy relacionados con este objeto se encuentran los objetos Drive, File, Folder y TextStream, ya que a
partir de un objeto FileSystemObject vamos a obtener instancias de estos otros componentes de
VBScript. Por ejemplo, a través del método GetDrive() del objeto FileSystemObject se obtiene un
objeto Drive.

Además este objeto presenta una única propiedad llamada Drives, que es una colección de objetos
Drive que representa todas las unidades existentes en el servidor Web, incluyendo las unidades de red.
Por el contrario el objeto FileSystemObject ofrece un gran número de métodos, a continuación vamos
a comentar todos ellos y los vamos a agrupar atendiendo a las funciones que ofrecen los mismos.


Métodos para trabajar con unidades de disco

• DriveExists(unidadDisco): devuelve verdadero si la unidad de disco indicada existe, devuelve
falso en caso contrario. El parámetro que identifica a la unidad puede tener el formato c, c:, c\,
o \\maquina\nombreCompartido, o el camino completo a un fichero o directorio.

• GetDrive(unidadDisco): devuelve un objeto Drive que se corresponde con la unidad
especificada. A través del objeto Drive podremos obtener información detallada de la unidad a
través de las propiedades que ofrece este objeto y que veremos en el apartado correspondiente.
• GetDriveName(unidadDisco): devuelve una cadena que representa al nombre de la unidad
indicada.

Vamos a realizar un sencillo ejemplo que comprueba las unidades de disco que existen en el servidor,
mostrando también su nombre completo. Para ello se utiliza un bucle con los códigos ANSI desde la A
a la Z, si la unidad existe se muestra junto con su nombre completo.

<%Set objFSO=Server.CreateObject("Scripting.FileSystemObject")
For i=65 To 90 'códigos ANSI de la A a la Z
letra=Chr(i)&":"
If objFSO.DriveExists(letra) Then
Response.Write "Unidad encontrada, nombre:
"&objFSO.GetDriveName(letra)&"<br>"
End if
Next%>


Resultados:

Unidad encontrada, nombre: A:
Unidad encontrada, nombre: B:
Unidad encontrada, nombre: C:


Métodos para trabajar con carpetas

• BuildPath(ruta, nombre): devuelve una cadena que resulta de añadir el fichero o directorio
indicado en nombre a la ruta especificada, añadiendo un caracter \ si es necesario.
Programación de aplicaciones para Internet con ASP © Grupo EIDOS

• CopyFolder(origen, destino, sobreescribir): copia la carpeta o carpetas indicadas en origen,
pudiéndose utilizar caracteres comodín, a la carpeta de destino especificada, incluyendo todo
el contenido de la carpeta origen, es decir, se trata de una copia recursiva. En sobreescribir
indicaremos True o False según proceda, el valor por defecto es True. Se producirá un error si
la carpeta de destino existe y el valor de sobreescribir es False. Para poder copiar una carpeta,
y en definitiva para poder realizar cualquier operación de escritura, es necesario que el usuario
anónimo de Internet (IUSR_NombreMaquina), posea los permisos necesarios para realizar
tales operaciones. Esto es aplicable a todos los objetos del sistema de archivos. Tanto origen
como destino deben ser rutas físicas. Si destino finaliza en \ se copiará el origen en la carpeta
destino, en caso contrario se creará la carpeta destino.

• CreateFolder(nombreCarpeta): crea el directorio con la ruta y nombre especificados. Se
produce un error si la carpeta ya existe.

• DeleteFolder(carpeta, forzar): elimina la carpeta especificada junto con todo su contenido,
permitiendo utilizar caracteres comodín. Si el parámetro forzar tiene el valor True se eliminará
la carpeta aunque sólo sea de lectura, el valor por defecto de este parámetro es False.

• FolderExits(carpeta): devuelve verdadero si la carpeta indicada existe, y falso en caso
contrario.

• GetAbsolutePathName(ruta): devuelve la ruta completa correspondiente a la que indicamos
por parámetro. Desde la ejecución de una página ASP este valor siempre será
c:\winnt\system32.

• GetFolder(carpeta): devuelve un objeto Folder que se corresponde con la carpeta indicada. A
través del objeto Folder se podrá obtener información detallada de la carpeta y también se
podrá manipular a través de los métodos que ofrece el objeto Folder.

• GetParentFolderName(ruta): devuelve el nombre de la carpeta padre de la ruta especificada.
No comprueba si la ruta existe.

• GetSpecialFolder(carpeta): devuelve un objeto Folder que se corresponde con la carpeta
especial indicada, podemos indicarlo mediante las constantes definidas en la librería de tipos
del objeto FileSystemObject, estas constantes son: WindowsFolder(0), SystemFolder(1) y
TemporaryFolder(2).

• MoveFolder(origen, destion): mueve la carpeta o carpetas indicadas en el origen al destino
especificado, en el parámetro origen se pueden utilizar comodines. Se producirá un error si la
carpeta de destino ya existe. Si destino finaliza en \ se asume que es un directorio en el que se
moverá el directorio de origen, en caso contrario se asumirá que es el nombre del nuevo
directorio.

El Código fuente siguiente es un pequeño resumen que muestra la utilización de este grupo de métodos del
objeto FileSystemObject.


<%Set objFSO=Server.CreateObject("Scripting.FileSystemObject")%>
BuildPath devuelve: <%=objFSO.BuildPath("c:\winnt\tmp","fichero.txt")%><br>

<%objFSO.CopyFolder "c:\asfroot","c:\temp"
Response.Write "carpeta copiada<br>"
objFSO.CreateFolder "c:\tmp\Carpeta Nueva"
Response.Write "carpeta creada<br>"%>
FolderExists devuelve: <%=objFSO.FolderExists("c:\tmp\Carpeta Nueva")%><br>

<%objFSO.DeleteFolder "c:\tmp\*.*"

Response.Write "carpeta borrada<br>"%>
AbsolutePathName devuelve: <%=objFSO.GetAbsolutePathName("origen")%><br>
GetParentFolderName devuelve: <%=objFSO.GetParentFolderName("c:\tmp\Carpeta
Nueva")%><br>

<%objFSO.MoveFolder "c:\tmp","c:\asfroot\Nueva Carpeta"
Response.Write "La carpeta se ha movido<br>"%>

  
Resultados:

BuildPath devuelve: c:\winnt\tmp\fichero.txt
carpeta copiada
carpeta creada
Folder exists devuelve true
carpeta borrada
AbsolutPathName devuelve: C:\Winnt\system32\origen
GetParentFolderName devuelve c:\temp
La carpeta se ha movido


Métodos para trabajar con ficheros
• CopyFile(origen, destino, sobreescibir): copia el fichero o ficheros especificados en origen al
destino indicado. Si destino finaliza con \ entonces se asume que destino es una carpeta, en
caso contrario se asume que es el nombre del fichero de destino. Se producirá un error si el
fichero de destino ya existe y sobreescribir tiene el valor falso.

• CreateTextFile(nombreFichero, sobreescibir, unicode): crea un nuevo fichero de texto con el
nombre de fichero especificado y devuelve un objeto TextStream que representa al fichero de
texto. Si el parámetro sobreescibir, que es opcional, tiene el valor True el fichero si existe se
sobreescibirá, por defecto tiene valor False. El parámetro unicode tambi´én es opcional y si
tiene el valor True se creará el contenido del fichero en texto en formato unicode, el valor por
defecto de este parámetro es False.

• DeleteFile(nombreFichero, forzar): borra el fichero o ficheros especificados, ya que permite
utilizar comodines. Para borrar ficheros de sólo lectura se debe indicar True en el parámetro
forzar, su valor por defecto es False. Si el fichero no existe se producirá un error.

• FileExists(nombreFichero): devuelve verdadero si el fichero indicado existe, devolverá falso
en caso contrario.

• GetBaseName(nombreFichero): devuelve únicamente el nombre del fichero indicado, sin ruta
y sin extensión.

• GetExtensionName(nombreFichero): devuelve únicamente la extensión del fichero indicado.

• GetFile(nombreFichero): devuelve un objeto File que va a representar al fichero indicado en el
parámetro. Mediante las propiedades y métodos de File podremos obtener información
detallada del fichero y realizar operaciones con el.

• GetFileName(nombreFichero): devuelve el nombre del fichero indicado junto con su
extensión.

• GetTempName(): devuelve un nombre de fichero generado aleatoriamente, que se puede
utilizar para crear ficheros temporales.

• MoveFile(origen, destino): mueve el fichero o ficheros especificados en origen a la carpeta
indicada en destino. Si destino finaliza con \ se asume que es el directorio en el que se va a
mover el fichero, en caso contrario destino será la ruta y el nombre del nuevo fichero. Si el
fichero de destino existe se producirá un error.

• OpenTextFile(nombreFichero, modo, crear, formato): crea un fichero de texto con el nombre
indicado y devuelve un objeto TextStream que permite manipularlo, el resto de los parámetros
son opcionales. El modo puede ser una de las siguientes constantes ForReading(1), es decir,
de sólo lectura, ForWriting(2), para escritura eliminando todos los contenidos, y
ForAppending(8), de escritura para añadir contenidos sin eliminar los existentes, por defecto
el valor de este parámetro es ForReading. El fichero si se abre para escritura y no existe y el
parámetro crear tiene el valor True se creará un nuevo fichero, por defecto el valor de este
parámetro es False. Los formatos válidos del fichero son TristateFalse(0) para abrirlo como
texto ASCII, TristateTrue(-1) para abrir el fichero como unicode y TristateUseDefault(-2) para
abrir el fichero utilizando el formato por defecto del sistema. Por defecto el parámetro formato
tiene el valor TristateFalse.
Al igual que hicimos con el grupo de métodos anteriores, vamos a mostrar un ejemplo resumen de
utilización de todos estos métodos (Código fuente siguiente).


<%Set objFSO=Server.CreateObject("Scripting.FileSystemObject")
objFSO.CopyFile "c:\Work\image5.gif","c:\basura\",True
Response.Write "Fichero copiado<br>"
objFSO.CreateTextFile "c:\work\fichero.txt"
Response.Write "Fichero creado<br>"
objFSO.DeleteFile "c:\tmp\*.gif"
Response.Write "Ficheros borrados<br>"%>
FileExists devuelve: <%=objFSO.FileExists("c:\Work\image5.gif")%><br>
GetBaseName devuelve: <%=objFSO.GetBaseName("c:\Work\image5.gif")%><br>
GetExtensionName devuelve: <%=objFSO.GetExtensionName("c:\Work\image5.gif")%><br>
GetFileName devuelve: <%=objFSO.GetFileName("c:\Work\image5.gif")%><br>
GetTempName devuelve: <%=objFSO.GetTempName()%><br>
<%objFSO.MoveFile "c:\basura\image5.gif","c:\tmp\"
Response.Write "El fichero se ha movido<br>"
objFSO.OpenTextFile "c:\work\fichero.txt"
Response.Write "Fichero abierto<br>"%>

Resultados:
Fichero copiado
Fichero creado
Ficheros borrados
FileExists devuelve True
GetBaseName devuelve: image5
GetExtensionName devuelve image5.gif
GetTempName devuelve: rad5DAEO.tmp
El fichero se ha movido
Fichero abierto

Como se ha podido comprobar el objeto FileSystemObject es bastante complejo ya que ofrece una
gran funcionalidad, ahora vamos a pasar a tratar cada uno de los objetos relacionados con
FileSystemObject, es decir, los objetos Drive, que representa a una unidad, Folder, que representa a
una carpeta, File, que representa a un fichero y TextStream que representa a un fichero de texto