Biblioteca de tiempo de ejecución de Scripting  

Código de ejemplo de FileSystemObject

El código de ejemplo descrito en esta sección proporciona un ejemplo real que demuestra muchas de las características disponibles en el modelo de objetos FileSystemObject. Este código muestra cómo todas las características del modelo de objetos funcionan juntas y cómo utilizar esas características eficazmente en su propio código.

Observe que puesto que este código es bastante genérico, se necesita algún código adicional además de ligeras modificaciones para que este código se pueda ejecutar en su equipo. Estos cambios son necesarios por las diversas maneras en que se controlan las entradas y salidas al usuario entre las páginas Active Server y Windows Scripting Host.

Para ejecutar este código en una página Active Server, utilice los pasos siguientes:

Cree una página Web estándar con una extensión .asp.

Copie el código de ejemplo siguiente en ese archivo entre las etiquetas <BODY>...</BODY>.

Encierre todo el código dentro de etiquetas <%...%>.

Mueva la instrucción Option Explicit desde su posición actual en el código a la parte superior de su página HTML, colocándolo incluso antes de la etiqueta <HTML> de apertura.

Sitúe etiquetas <%...%> alrededor de la instrucción Option Explicit para asegurarse de que se ejecuta en el servidor.

Agregue el código siguiente al final del código de ejemplo:

Sub Print(x)
   Response.Write "<PRE>&ltFONT FACE=""Courier New"" SIZE=""1"">"
   Response.Write x
   Response.Write "</FONT></PRE>"
End Sub
Main

El código anterior agrega un procedimiento de impresión que se ejecutará en el servidor pero que muestra los resultados en el cliente. Para ejecutar este código en Windows Scripting Host, agregue el código siguiente al final del código de ejemplo:

Sub Print(x)
   WScript.Echo x
End Sub
Main

La siguiente sección contiene el código:

''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
' Código de ejemplo FileSystemObject 
' Copyright 1998 Microsoft Corporation.  Todos los derechos reservados. 
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''

Option Explicit

''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
' En cuanto a la calidad del código:
' 1) El código siguiente realiza un tratamiento de cadenas 
'    concatenando  cadenas cortas con el operador "&" .
'    Puesto que la concatenación de cadenas es costosa, esta es una
'    manera poco eficiente de escribir el código.
'    No obstante, es una forma de escribir código muy facil de 
'    mantener y se utiliza aquí porque este programa realiza 
'    frecuentes operaciones de disco y porque el disco es mucho 
'    más lento que las operaciones de memoria necesarias para 
'    concatenar las cadenas. Tenga en cuenta que esto es un código
'    de demostración, no un código de producción.
'
' 2) "Option Explicit" se utiliza porque un acceso de variable declarada
'    es un poco más rápido que el acceso de variable no declarada. 
'    También evita que se arrastren los errores por todo el código, 
'    como cuando escribe DriveTypeCDORM en lugar de DriveTypeCDROM.
'
' 3) El control de errores está ausente en este código para conseguir
'    un código más legible. Aunque se tomaron precauciones para asegurar
'    que el código no cometerá errores en casos comunes, los sistemas de
'    archivo pueden ser impredecibles. En el código de producción, utilice '    On Error Resume Next y el objeto Err para atrapar posibles errores.
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''

''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
' Algunas variables globales útiles
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Dim TabStop
Dim NewLine

Const TestDrive = "C"
Const TestFilePath = "C:\Test"

''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
' Constantes devueltas por Drive.DriveType
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Const DriveTypeRemovable = 1
Const DriveTypeFixed = 2
Const DriveTypeNetwork = 3
Const DriveTypeCDROM = 4
Const DriveTypeRAMDisk = 5

''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
' Constantes devueltas por File.Attributes
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Const FileAttrNormal  = 0
Const FileAttrReadOnly = 1
Const FileAttrHidden = 2
Const FileAttrSystem = 4
Const FileAttrVolume = 8
Const FileAttrDirectory = 16
Const FileAttrArchive = 32 
Const FileAttrAlias = 64
Const FileAttrCompressed = 128

''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
' Constantes para abrir archivos
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Const OpenFileForReading = 1 
Const OpenFileForWriting = 2 
Const OpenFileForAppending = 8 

''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
' ShowDriveType
' Objetivo: 
' Genera una cadena que describe el tipo de unidad de un objeto
' Drive dado.
' Demuestra lo siguiente
' - Drive.DriveType
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Function ShowDriveType(Drive)

   Dim S
  
   Select Case Drive.DriveType
   Case DriveTypeRemovable
      S = "Extraible"
   Case DriveTypeFixed
      S = "Fijo"
   Case DriveTypeNetwork
      S = "Red"
   Case DriveTypeCDROM
      S = "CD-ROM"
   Case DriveTypeRAMDisk
      S = "Disco RAM"
   Case Else
      S = "Desconocido"
   End Select

   ShowDriveType = S

End Function

''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
' ShowFileAttr
' Objetivo: 
' Genera una cadena que describe los atributos de un archivo o carpeta.
' Demuestra lo siguiente
' - File.Attributes
' - Folder.Attributes
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''

Function ShowFileAttr(File) ' File puede ser un archivo o carpeta

   Dim S
     Dim Attr
   
   Attr = File.Attributes

   If Attr = 0 Then
      ShowFileAttr = "Normal"
      Exit Function
   End If

   If Attr And FileAttrDirectory  Then S = S & "Directorio "
   If Attr And FileAttrReadOnly   Then S = S & "Sólo lectura"
   If Attr And FileAttrHidden     Then S = S & "Oculto "
   If Attr And FileAttrSystem     Then S = S & "Sistema "
   If Attr And FileAttrVolume     Then S = S & "Volumen "
   If Attr And FileAttrArchive    Then S = S & "Modificado "
   If Attr And FileAttrAlias      Then S = S & "Alias "
   If Attr And FileAttrCompressed Then S = S & "Comprimido "

   ShowFileAttr = S

End Function

''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
' GenerateDriveInformation
' Objetivo: 
' Genera una cadena que describe el estado actual de las unidades
' disponibles.
' Demuestra lo siguiente
' - FileSystemObject.Drives 
' - Iterating the Drives collection
' - Drives.Count
' - Drive.AvailableSpace
' - Drive.DriveLetter
' - Drive.DriveType
' - Drive.FileSystem
' - Drive.FreeSpace
' - Drive.IsReady
' - Drive.Path
' - Drive.SerialNumber
' - Drive.ShareName
' - Drive.TotalSize
' - Drive.VolumeName
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''

Function GenerateDriveInformation(FSO)

   Dim Drives
   Dim Drive
   Dim S

   Set Drives = FSO.Drives
   S = "Número de unidades:" & TabStop & Drives.Count & NewLine & NewLine

   ' Construir la primera línea del informe.
   S = S & String(2, TabStop) & "Nombre" 
   S = S & String(3, TabStop) & "Sistema" 
   S = S & TabStop & "Espacio"
   S = S & TabStop & "Espacio"
   S = S & TabStop & "Espacio" 
   S = S & TabStop & "Número" & NewLine

   ' Construir la segunda línea del informe.
   S = S & "Letra"
   S = S & TabStop & "Ruta"
   S = S & TabStop & "Tipo"
   S = S & TabStop & "¿Listo?"
   S = S & TabStop & "de unidad"
   S = S & TabStop & "de archivos"
   S = S & TabStop & "total"
   S = S & TabStop & "libre"
   S = S & TabStop & "disponible"
   S = S & TabStop & "de serie" & NewLine   

   ' Línea separadora.
   S = S & String(105, "-") & NewLine

   For Each Drive in Drives
      S = S & Drive.DriveLetter
      S = S & TabStop & Drive.Path
      S = S & TabStop & ShowDriveType(Drive)
      S = S & TabStop & Drive.IsReady

      If Drive.IsReady Then
          If DriveTypeNetwork = Drive.DriveType Then
            S = S & TabStop & Drive.ShareName 
         Else
            S = S & TabStop & Drive.VolumeName 
         End If    
         S = S & TabStop & Drive.FileSystem
         S = S & TabStop & Drive.TotalSize
         S = S & TabStop & Drive.FreeSpace
         S = S & TabStop & Drive.AvailableSpace
         S = S & TabStop & Hex(Drive.SerialNumber)
      End If

      S = S & NewLine

   Next

   GenerateDriveInformation = S

End Function

''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
' GenerateFileInformation
' Objetivo: 
' Genera una cadena que describe el estado actual de un archivo.
' Demuestra lo siguiente
' - File.Path
' - File.Name
' - File.Type
' - File.DateCreated
' - File.DateLastAccessed
' - File.DateLastModified
' - File.Size
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''

Function GenerateFileInformation(File)

   Dim S

   S = NewLine & "Ruta:" & TabStop & File.Path
   S = S & NewLine & "Nombre:" & TabStop & File.Name
   S = S & NewLine & "Tipo:" & TabStop & File.Type
   S = S & NewLine & "Atributos:" & TabStop & ShowFileAttr(File)
   S = S & NewLine & "Creado:" & TabStop & File.DateCreated
   S = S & NewLine & "Con acceso:" & TabStop & File.DateLastAccessed
   S = S & NewLine & "Modificado:" & TabStop & File.DateLastModified
   S = S & NewLine & "Tamaño" & TabStop & File.Size & NewLine

   GenerateFileInformation = S

End Function
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
' GenerateFolderInformation
' Objetivo: 
' Genera una cadena que describe el estado actual de una carpeta.
' Demuestra lo siguiente
' - Folder.Path
' - Folder.Name
' - Folder.DateCreated
' - Folder.DateLastAccessed
' - Folder.DateLastModified
' - Folder.Size
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''

Function GenerateFolderInformation(Folder)

   Dim S

   S = "Ruta:" & TabStop & Folder.Path
   S = S & NewLine & "Nombre:" & TabStop & Folder.Name
   S = S & NewLine & "Atributos:" & TabStop & ShowFileAttr(Folder)
   S = S & NewLine & "Creado:" & TabStop & Folder.DateCreated
   S = S & NewLine & "Con acceso:" & TabStop & Folder.DateLastAccessed
   S = S & NewLine & "Modificado:" & TabStop & Folder.DateLastModified
   S = S & NewLine & "Tamaño:" & TabStop & Folder.Size & NewLine

   GenerateFolderInformation = S

End Function

''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
' GenerateAllFolderInformation
' Objetivo: 
' Genera una cadena que describe el estado actual de una carpeta y
' todos los archivos y subcarpetas.
' Demuestra lo siguiente
' - Folder.Path
' - Folder.SubFolders
' - Folders.Count
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''

Function GenerateAllFolderInformation(Folder)

   Dim S
   Dim SubFolders
   Dim SubFolder
   Dim Files
   Dim File

   S = "Carpeta:" & TabStop & Folder.Path & NewLine & NewLine
   Set Files = Folder.Files

   If 1 = Files.Count Then
      S = S & "Hay 1 archivo" & NewLine
   Else
      S = S & "Hay " & Files.Count & " archivos" & NewLine
   End If

   If Files.Count <> 0 Then
      For Each File In Files
         S = S & GenerateFileInformation(File)
      Next
   End If

   Set SubFolders = Folder.SubFolders

   If 1 = SubFolders.Count Then
      S = S & NewLine & "Hay 1 subcarpeta" & NewLine & NewLine
   Else
      S = S & NewLine & "Hay" & SubFolders.Count & " subcarpetas" & NewLine & NewLine
   End If

   If SubFolders.Count <> 0 Then
      For Each SubFolder In SubFolders
         S = S & GenerateFolderInformation(SubFolder)
      Next
      S = S & NewLine
      For Each SubFolder In SubFolders
         S = S & GenerateAllFolderInformation(SubFolder)
      Next
   End If

   GenerateAllFolderInformation = S

End Function

''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
' GenerateTestInformation
' Objetivo: 
' Genera una cadena que describe el estado actual de la carpeta 
' C:\Test y todos los archivos y subcarpetas.
' Demuestra lo siguiente
' - FileSystemObject.DriveExists
' - FileSystemObject.FolderExists
' - FileSystemObject.GetFolder
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''

Function GenerateTestInformation(FSO)

   Dim TestFolder
   Dim S

   If Not FSO.DriveExists(TestDrive) Then Exit Function
   If Not FSO.FolderExists(TestFilePath) Then Exit Function

   Set TestFolder = FSO.GetFolder(TestFilePath)

   GenerateTestInformation = GenerateAllFolderInformation(TestFolder) 

End Function

''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
' DeleteTestDirectory
' Objetivo: 
' Limpia el directorio de prueba.
' Demuestra lo siguiente
' - FileSystemObject.GetFolder
' - FileSystemObject.DeleteFile
' - FileSystemObject.DeleteFolder
' - Folder.Delete
' - File.Delete
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''

Sub DeleteTestDirectory(FSO)

   Dim TestFolder
   Dim SubFolder
   Dim File
   
   ' Dos formas de eliminar un archivo:

   FSO.DeleteFile(TestFilePath & "\Beatles\OctopusGarden.txt")

   Set File = FSO.GetFile(TestFilePath & "\Beatles\BathroomWindow.txt")
   File.Delete   

   ' Dos formas de eliminar una carpeta:
   FSO.DeleteFolder(TestFilePath & "\Beatles")
   FSO.DeleteFile(TestFilePath & "\ReadMe.txt")
   Set TestFolder = FSO.GetFolder(TestFilePath)
   TestFolder.Delete

End Sub

''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
' CreateLyrics
' Objetivo: 
' Genera un par de archivos de texto en una carpeta.
' Demuestra lo siguiente
' - FileSystemObject.CreateTextFile
' - TextStream.WriteLine
' - TextStream.Write
' - TextStream.WriteBlankLines
' - TextStream.Close
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''

Sub CreateLyrics(Folder)

   Dim TextStream
   
   Set TextStream = Folder.CreateTextFile("OctopusGarden.txt")
   
   TextStream.Write("Octopus' Garden ") ' Note que esto no agrega una línea al archivo.
   TextStream.WriteLine("(por Ringo Starr)")
   TextStream.WriteBlankLines(1)
   TextStream.WriteLine("I'd like to be under the sea in an octopus' garden in the shade,")
   TextStream.WriteLine("He'd let us in, knows where we've been -- in his octopus' garden in the shade.")
   TextStream.WriteBlankLines(2)
   
   TextStream.Close

   Set TextStream = Folder.CreateTextFile("BathroomWindow.txt")
   TextStream.WriteLine("She Came In Through The Bathroom Window (por Lennon/McCartney)")
   TextStream.WriteLine("")
   TextStream.WriteLine("She came in through the bathroom window protected by a silver spoon")
   TextStream.WriteLine("But now she sucks her thumb and wanders by the banks of her own lagoon")
   TextStream.WriteBlankLines(2)
   TextStream.Close

End Sub

''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
' GetLyrics
' Objetivo: 
' Muestra los contenidos de los archivos de letras.
' Demuestra lo siguiente
' - FileSystemObject.OpenTextFile
' - FileSystemObject.GetFile
' - TextStream.ReadAll
' - TextStream.Close
' - File.OpenAsTextStream
' - TextStream.AtEndOfStream
' - TextStream.ReadLine
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''

Function GetLyrics(FSO)

   Dim TextStream
   Dim S
   Dim File

   ' Hay varias formas de abrir un archivo de texto y varias formas de
   ' leer los datos de un archivo.  Aquí hay dos formas para hacer cada
   ' una de ellas:

   Set TextStream = FSO.OpenTextFile(TestFilePath & "\Beatles\OctopusGarden.txt", OpenFileForReading)
   
   S = TextStream.ReadAll & NewLine & NewLine
   TextStream.Close

   Set File = FSO.GetFile(TestFilePath & "\Beatles\BathroomWindow.txt")
   Set TextStream = File.OpenAsTextStream(OpenFileForReading)
   Do    While Not TextStream.AtEndOfStream
      S = S & TextStream.ReadLine & NewLine
   Loop
   TextStream.Close

   GetLyrics = S
   
End Function

''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
' BuildTestDirectory
' Objetivo: 
' Genera una jerarquía de directorio para demostrar FileSystemObject.
' Construimos una jerarquía en este orden:
' C:\Test
' C:\Test\ReadMe.txt
' C:\Test\Beatles
' C:\Test\Beatles\OctopusGarden.txt
' C:\Test\Beatles\BathroomWindow.txt
' Demuestra lo siguiente
' - FileSystemObject.DriveExists
' - FileSystemObject.FolderExists
' - FileSystemObject.CreateFolder
' - FileSystemObject.CreateTextFile
' - Folders.Add
' - Folder.CreateTextFile
' - TextStream.WriteLine
' - TextStream.Close
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''

Function BuildTestDirectory(FSO)

   
   Dim TestFolder
   Dim SubFolders
   Dim SubFolder
   Dim TextStream

   ' Salir si (a) la unidad no existe, o si (b) ya existe el directorio
   ' generado.

   If Not FSO.DriveExists(TestDrive) Then
      BuildTestDirectory = False
      Exit Function
   End If

   If FSO.FolderExists(TestFilePath) Then
      BuildTestDirectory = False
      Exit Function
   End If

   Set TestFolder = FSO.CreateFolder(TestFilePath)

   Set TextStream = FSO.CreateTextFile(TestFilePath & "\ReadMe.txt")
   TextStream.WriteLine("Mi colección de letras de canciones")
   TextStream.Close

   Set SubFolders = TestFolder.SubFolders
   Set SubFolder = SubFolders.Add("Beatles")
   CreateLyrics SubFolder   
   BuildTestDirectory = True

End Function

''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
'La rutina principal
' Primero, crea un directorio de prueba, junto con algunas subcarpetas
' y archivos. Entonces, vuelca alguna información sobre las unidades
' de disco disponibles y sobre el directorio de prueba y después,
' limpia todo de nuevo.
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''

Sub Main
   Dim FSO

   ' Configurar datos globales.
   TabStop = Chr(9)
   NewLine = Chr(10)
   
   Set FSO = CreateObject("Scripting.FileSystemObject")

   If Not BuildTestDirectory(FSO) Then 
      Print "El directorio de prueba ya existe o no se puede crear. No puede continuar."
      Exit Sub
   End If

   Print GenerateDriveInformation(FSO) & NewLine & NewLine
   Print GenerateTestInformation(FSO) & NewLine & NewLine
   Print GetLyrics(FSO) & NewLine & NewLine
   DeleteTestDirectory(FSO)

End Sub


 
Ayuda de Javascript y Vbscript para Javascripts.astalaweb.com.