Tutorial de AutoHotkey (VIII): manejo de archivos

En este último post dedicado a AutoHotkey te mostraré mediante unos sencillos ejemplos cómo crear macros con las que poder trabajar con archivos y carpetas.

Para ello en primer lugar hay que tener en cuenta que antes de acceder a un archivo o carpeta para realizar alguna operación es recomendable comprobar si existe, utilizando para ello las sentencias IfExistIfNotExist.

Veamos ahora cómo usar el comando FileAppend para insertar texto al final de un archivo (que será creado en caso de no existir), y FileRead para obtener su contenido.

En el siguiente ejemplo, al presionar la combinación de teclado {CTRL}{MAYÚSCULAS}{E} se mostrará un cuadro de diálogo con el contenido de un fichero llamado «archivo.txt» que deberá encontrarse en la carpeta «c:\temp», siendo creado con tres líneas de texto (insertadas con el comando FileAppend) en caso de no existir:

; {CTRL}{MAYÚSCULAS}{E} Insertar texto y leer un archivo
^+e::
    IfNotExist C:\Temp\archivo.txt
    {
        MsgBox El archivo no existe, se creará.

        FileAppend Primera línea`n, C:\Temp\archivo.txt
        FileAppend Segunda línea`n, C:\Temp\archivo.txt
        FileAppend Tercera línea`n, C:\Temp\archivo.txt
    }

    FileRead contenido, C:\Temp\archivo.txt

    MsgBox %contenido%
return

Con `n se inserta un salto de línea.

Contenido del archivo

Si deseamos dar la posibilidad de seleccionar un archivo o carpeta al usuario que ejecute una macro, disponemos de los comandos FileSelectFile y FileSelectFolder respectivamente.

En este otro ejemplo se abrirá un cuadro de diálogo que mostrará los archivos del directorio «c:\temp» cuya extensión sea .txt o .doc, permitiendo seleccionar uno de ellos y mostrando su contenido luego:

; {CTRL}{MAYÚSCULAS}{F} Seleccionar y leer un Archivo
^+f::
    FileSelectFile archivo, 2, C:\Temp, Abre un archivo, Text Documents (*.txt; *.doc)

    if archivo =
    {
        MsgBox No se ha seleccionado ningún archivo.
    }
    else
    {
        FileRead contenido, %archivo%
        MsgBox CONTENIDO DEL ARCHIVO`n`n%contenido%
    }
return

El parámetro con valor ‘2’ en FileSelectFolder indica que la ruta especificada debe existir obligatoriamente (consulta su documentación para más información sobre los parámetros que admite).

Seleccionar archivo

En el caso de tener que leer un archivo muy grande es preferible recorrerlo para ir obteniendo el texto línea a línea.

Observa cómo en el siguiente ejemplo se recorre línea a línea el archivo seleccionado por el usuario (limitado a los que tengan extensión .txt o .doc), almacenándose su contenido en una variable de nombre contenido que será mostrada al final del proceso:

^+g::
    FileSelectFile archivo, 3, C:\Temp, Abre un archivo, Text Documents (*.txt; *.doc)

    contenido = 

    if archivo =
    {
        MsgBox No se ha seleccionado ningún archivo.
    }
    else
    {
        Loop read, %archivo%
        {
            Loop parse, A_LoopReadLine,`n,`r
            {
                contenido = %contenido%%A_LoopField%`n
            }
        }

        MsgBox CONTENIDO DEL ARCHIVO`n`n%contenido%
    }
return

Para recorrer el fichero línea a línea se ha usado un bucle Loop Parse anidado dentro de otro bucle Loop read, especificando la opción A_LoopReadLine en el primero de ellos para recorrerlo.

El contenido de cada línea leída desde el archivo es obtenido a través de la variable interna A_LoopField, siendo almacenado a cada paso en la variable contenido para ser mostrado al final del proceso.

En este caso hemos especificado el salto de línea con `n, `r para que el archivo resultante sea compatible tanto con Windows como con Linux.

extensión de archivo

Veamos ahora otro ejemplo que te resultará útil en caso de que necesites recorrer los archivos que haya en una carpeta:

; {CTRL}{MAYÚSCULAS}{h} Mostrar los archivos con extensión .jpg que haya en una determinada carpeta
^+h::
    clipboard =
    Loop c:\Temp\*.jpg
        clipboard = %clipboard%%A_LoopFileName%`n

    MsgBox %clipboard%
return

Para recorrer la carpeta «c:\Temp» se ha usado nuevamente un bucle Loop, siendo almacenados en el portapapeles de Windows los nombres de los archivos (obtenidos con la variable interna A_LoopFileName) cuya extensión sea .jpg.

Para acceder al portapapeles del sistema se utiliza la variable interna clipboard (observa que se inicializa antes del bucle para limpiar el contenido que pueda tener).

Lista de archivos

Para finalizar, otros comandos útiles para el manejo de archivos son FileCopy, FileMove y FileDelete, usados para copiar y renombrar, mover y eliminar archivos respectivamente.

En este último ejemplo utilizamos FileCopy para crear una copia de un archivo con otro nombre, y para copiar todos los que se encuentren en el directorio «c:\Temp» cuya extensión sea .doc a la carpeta «Temp» de la unidad «D:»

; {CTRL}{MAYÚSCULAS}{i} Renombrar y copiar archivos
^+i::
    FileCopy C:\Temp\foto.jpg, D:\Temp\vacaciones1.jpg
    FileCopy C:\Temp\*.doc, D:\Temp\
    MsgBox Proceso realizado
return

En este post te he mostrado tan sólo una introducción sobre algunas de las operaciones básicas referentes al tratamiento de archivos con AutoHotkey, pero sus posibilidades van mucho más allá permitiendo realizar otras como por ejemplo obtener cierta información sobre ellos, modificar sus atributos, trabajar con archivos de configuración .ini, e incluso realizar modificaciones en el registro de Windows (su archivo de configuración principal).

Si deseas aprender más sobre el manejo de archivos con AutoHotkey te recomiendo que consultes enlace a la documentación oficial.

Si te ha gustado esta serie de artículos y me quieres hacer un pequeño favor, compártelo en tu red social favorita 🙂