# Rutas y archivos

#### Trabajar con rutas y archivos.

### path

Obtener información de una ruta.

    ruta_archivo = '/home/mau/mi_archivo.ods'
    p = app.paths(ruta_archivo)

    app.debug(p.path)
    app.debug(p.file_name)
    app.debug(p.name)
    app.debug(p.ext)
    app.debug(p.size)
    app.debug(p.url)

    15/08/2022 14:40:08 - DEBUG - /home/mau
    15/08/2022 14:40:08 - DEBUG - mi_archivo.ods
    15/08/2022 14:40:08 - DEBUG - mi_archivo
    15/08/2022 14:40:08 - DEBUG - ods
    15/08/2022 14:40:08 - DEBUG - 7011
    15/08/2022 14:40:08 - DEBUG - file:///home/mau/mi_archivo.ods

Obtener la misma información como un tupla.

    ruta_archivo = '/home/mau/mi_archivo.ods'
    p = app.paths(ruta_archivo)
    app.debug(p.info)

    15/08/2022 14:43:01 - DEBUG - ('/home/mau', 'mi_archivo.ods', 'mi_archivo', 'ods', 7011, 'file:///home/mau/mi_archivo.ods')

O como diccionario.

    ruta_archivo = '/home/mau/mi_archivo.ods'
    p = app.paths(ruta_archivo)
    app.debug(p.dict)

    15/08/2022 14:43:01 - DEBUG - {'path': '/home/mau', 'file_name': 'mi_archivo.ods', 'name': 'mi_archivo', 'ext': 'ods', 'size': 7011, 'url': 'file:///home/mau/mi_archivo.ods'}

### home

Obtener la carpeta de inicio del usuario.

    p = app.paths
    app.debug(p.home)

### documents

Obtener la carpeta Documentos del usuario.

    p = app.paths
    app.debug(p.documents)

### user_profile

Obtener la ruta del perfil de usuario.

    p = app.paths
    app.debug(p.user_profile)

### user_config

Obtener la ruta de la carpeta `config` en el perfil de usuario.

    p = app.paths
    app.debug(p.user_config)

### python

Obtener la ruta del ejecutable `python`

    p = app.paths
    app.debug(p.python)

### to_system

Pasar una ruta en formato URL al formato del sistema de archivos del SO.

    p = app.paths
    ruta_url = 'file:///home/mau/mi_archivo.ods'
    ruta = p.to_system(ruta_url)
    app.debug(ruta)

### to_url

Pasar una ruta del sistema de archivos del SO al formato URL.

    p = app.paths
    ruta = '/home/mau/mi_archivo.ods'
    ruta_url = p.to_url(ruta)
    app.debug(ruta_url)

### config

Obtener rutas de la configuración de LibreOffice. Por default obtiene la ruta de `Documentos`, para otras ruta mire Api XPathSettings

    p = app.paths
    ruta = p.config()
    app.debug(ruta)

    ruta = p.config('UserConfig')
    app.debug(ruta)

Algunas rutas pueden ser más de una, separados por `;`, en este caso, el resultado es una lista con las rutas.

### join

Concatenar rutas.

    p = app.paths
    ruta = p.join('/home/mau', 'pruebas', 'archivo.ods')
    app.debug(ruta)

### exists

Verificar si una ruta existe.

    p = app.paths
    resultado = p.exists('/home/mau/test/archivo.ods')
    app.debug(resultado)

### exists_app

Verificar si una aplicación existe.

    p = app.paths

    resultado = p.exists_app('noexiste')
    app.debug(resultado)

    resultado = p.exists_app('soffice')
    app.debug(resultado)

### is_dir

Verificar si la ruta es un directorio.

    p = app.paths
    resultado = p.is_dir('/home/mau')
    app.debug(resultado)

### is_file

Verificar si la ruta es un archivo.

    p = app.paths
    resultado = p.is_file('/home/mau/mi_archivo.ods')
    app.debug(resultado)

### temp_file

Crear un archivo temporal, es borrado automáticamente al cerrarse.

    p = app.paths

    f = p.temp_file()
    f.write(app.INFO_DEBUG)
    f.close()

Usado en `contexto`, se cierra automáticamente.

    with p.temp_file() as f:
        app.debug(f.name)
        f.write('test')

### temp_dir

Crear un directorio temporal, al salir del contexto, es eliminado junto con todo su contenido del sistema de archivos.

    p = app.paths

    with p.temp_dir() as d:
        app.debug(p.exists(d))
        app.debug(d)

    app.debug(p.exists(d))

### get

Permitir al usuario seleccionar archivos, devuelve solo la ruta. De forma predeterminada abre en la carpeta `Documentos`.

    p = app.paths
    ruta = p.get()
    app.debug(ruta)

Establecer que abra en otro directorio.

    ruta = p.get('/tmp')
    app.debug(ruta)

Agregar un filtro.

    ruta = p.get(filters='ods')
    app.debug(ruta)

Agregar multiples filtros.

    ruta = p.get(filters='xml,txt')
    app.debug(ruta)

Permitir selecciones multiples.

    ruta = p.get(filters='xml,txt', multiple=True)
    app.debug(ruta)

### get_dir

Permitir al usuario seleccionar un directorio, devuelve solo la ruta. De forma predeterminada abre en la carpeta `Documentos`.

    p = app.paths
    ruta = p.get_dir()
    app.debug(ruta)

Establecer que abra en otro directorio.

    ruta = p.get_dir('/tmp')
    app.debug(ruta)

### get_for_save

Permitir seleccionar un directorio y capturar el nombre del archivo, devuelve la ruta completa.

    p = app.paths
    ruta = p.get_for_save()
    app.debug(ruta)

Establecer que inicie en otro directorio.

    ruta = p.get_for_save('/tmp')
    app.debug(ruta)

Si se establece un filtro, automáticamente se agrega la extensión.

    ruta = p.get_for_save(filters='txt')
    app.debug(ruta)

### files

Obtener archivos de una ruta, no recursivamente. De forma predeterminada regresa todos, incluyendo archivos ocultos.

    ruta = '/home/mau'

    p = app.paths
    archivos = p.files(ruta)
    for a in archivos:
        app.debug(a)

Filtrar por tipo de archivo.

    p = app.paths
    archivos = p.files(ruta, '*.pdf')

Obtener archivos de forma recursiva.

    p = app.paths
    archivos = p.files(ruta, '**/*.xml')

### walk

Obtener archivos de forma recursiva.

    p = app.paths
    ruta = '/home/mau/Documents'
    archivos = p.walk(ruta)
    for a in archivos:
        app.debug(a)

Con filtro.

    archivos = p.walk(ruta, 'ods')

Con filtros.

    archivos = p.walk(ruta, 'ods|odt')

### dirs

Obtener los directorios de una ruta, no recursivamente.

    p = app.paths
    ruta = '/home/mau/Documents'
    folders = p.dirs(ruta)
    for f in folders:
        app.debug(f)

### walk_dirs

Obtener los directorios de una ruta, no recursivamente.

    p = app.paths
    ruta = '/home/mau/Documents'
    folders = p.walk_dirs(ruta)
    for f in folders:
        app.debug(f)

Obtener información en una lista de tuplas: (ID_FOLDER, ID_PADRE, NOMBRE)

    folders = p.walk_dirs(ruta, True)

### extension

Obtener la ruta de instalación de una extensión a partir de su ID.

    p = app.paths
    id_ext = 'net.elmau.zaz.talk'
    ruta = p.extension(id_ext)
    app.debug(ruta)

### replace_ext

Reemplazar extensión de un archivo.

    p = app.paths
    ruta = '/home/mau/mi_archivo.ods'
    ruta_nueva = p.replace_ext(ruta, 'pdf')
    app.debug(ruta_nueva)

### open

Abrir cualquier archivo con el programas predeterminado del SO.

    p = app.paths
    ruta = '/home/mau/archivo.pdf'
    p.open(ruta)

    ruta = '/home/mau/index.html'
    p.open(ruta)

### save y read

Guardar y leer datos, el encoding predeterminado es UTF8.

    p = app.paths
    datos = """¿Quieres saber quién eres? No preguntes. Actúa.
    La acción te delineará y definirá.

    Thomas Jefferson
    """

    ruta = '/home/mau/temp.txt'
    p.save(ruta, datos)

    datos = p.read(ruta)
    app.msgbox(datos)

Cambiar el encoding.

    app.paths.save(ruta, datos, 'iso-8859-1')

### save_bin y read_bin

Guardar y leer datos binarios.

    p = app.paths
    datos = b'Datos binarios'

    ruta = '/home/mau/temp.bin'
    p.save_bin(ruta, datos)

    datos = p.read_bin(ruta)
    app.msgbox(datos)

### save_json y read_json

Guardar y leer en formato json.

    p = app.paths

    ruta = '/home/mau/datos.json'
    datos = {
        'tipo': 'calc',
        'nombre': 'miarchivo.ods',
    }
    p.save_json(ruta, datos)

    datos = p.read_json(ruta)
    app.msgbox(datos)

### save_csv y read_csv

Exportar e importar datos en formato CSV. Vea la documentación CSV para los argumentos que puede usar.

    p = app.paths

    ruta = '/home/mau/datos.csv'
    ahora = app.dates.now
    datos = (
        (1, 'uno', ahora),
        (2, 'dos', ahora),
        (3, 'tres', ahora),
    )
    p.save_csv(ruta, datos)

    datos = p.read_csv(ruta)
    app.msgbox(datos)

### kill

Borra archivos o directorios con todo su contenido. Devuelve verdadero (True) en caso de exito y falso (Falso) en cualquier otro caso.

Este proceso es destructivo, es buena practica siempre solicitar confirmación al usuario.

    p = app.paths

    ruta = '/home/mau/temp.bin'
    resultado = p.kill(ruta)
    app.msgbox(resultado)

### copy

Copiar archivos. Devuelve la ruta completa final destino.

De un origen a una carpeta destino

    p = app.paths

    ruta_origen = '/home/mau/temp.txt'
    ruta_destino = '/home/mau/Desktop'
    ruta = p.copy(ruta_origen, ruta_destino)
    app.debug(ruta)

Cambiar el nombre destino.

    ruta_origen = '/home/mau/temp.txt'
    ruta_destino = '/home/mau/Desktop'
    nuevo_nombre = 'datos.csv'
    ruta = p.copy(ruta_origen, ruta_destino, nuevo_nombre)
    app.debug(ruta)