In un piccolo progettimo di web scraping in PHP, avevo la necessità di identificare il titolo di una pagina web partendo dal suo url.

Usando le funzioni file_get_contents e preg_match è abbastanza facile.

La prima funzione si occupa di recuperare il contenuto di quello che gli viene passato in argomento.

La seconda esegue una ricerca con le espresisoni regolari.

Non ho trovato nessuna funzione per contare il numero di righe di un file in Kotlin; quindi ho fatto come gli antichi:

  • apriamo il file
  • lo leggiamo
  • contiamo il numero di righe con un contatore
  • stampiamo il numero di righe

La gestione dei file temporanei in Kotlin (creazione, lettura e cancellazione) occpua all'incirca 3 righe di codice (5 se ci mettiamo i println per leggere il path e il contenuto).

Per creare un file temporaneo possiamo usare la funzione createTempFile, che accetta tre parametri facoltativi:

  • prefisso -> se non impostato, ne verrà impostato uno random
  • suffisso -> se non impostato, verrà usata l'estensione .tmp
  • directory -> se non impostata, verrà usata la directory temporanea del sistema sottostante

Lo scopo del codice che vedremo oggi nasce da una esigenza reale: mettere un watermark, corrispondente al nome del file, su tante immagini risiedenti tutte nella stessa cartella.

Facendolo in Java ci ho messo relativamente poco tempo.

Nel programma non è prevista una gui; il path viene dato tramite riga di comando.

Voi, ovviamente, fate tutte le modifiche che volete / vi servono.

Sono rimasto sorpreso dal poco codice che ho dovuto scrivere per listare file e directory in Kotlin.

Vediamo tre esempi, con tre funzioni diverse:

  • list() -> ritorna un array di String, e quindi stampa solo il nome dei file
  • listFiles() -> ritorna un array di File, e quindi è possibile accedere a tutte le varie funzioni e proprietà di un oggetto File
  • walk() -> che produce un FileTreeWalk, e lista i file in maniera ricorsiva; ci sono anche le funzioni walkBottomUp() e walkTopDown(), che si differenziano solo per il verso un cui eseguono la scansione (poetet vedere su Stack Overflow la mia domanda)