# CLAUDE.md This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository. ## Cos'è questo progetto `CadSearchGui` è un'app Windows Forms (.NET 10, WinForms) che indicizza e permette di cercare i file CAD Pro-ENGINEER/Creo contenuti in quattro cartelle di un disco/share di rete (`__Accessori`, `__B.end`, `__Corpi`, `__Fondi` sotto una radice, di default `X:\`), salvando i metadati in un DB SQLite locale (`cad_index.db`). ## Comandi Tutti da eseguire dentro `CadSearchGui/`. ```powershell dotnet build -c Release dotnet run -c Release ``` Pubblicazione come eseguibile standalone (single-file, self-contained, Windows x64): ```powershell dotnet publish -c Release -r win-x64 --self-contained true -p:PublishSingleFile=true -o publish ``` Non ci sono test automatizzati nel repo. ## Architettura Il programma è tutto in `CadSearchGui/` (nessun altro progetto nella solution — in passato esisteva anche una CLI separata e uno script Python di indicizzazione, entrambi rimossi: ora l'unico programma è questo, con GUI e indicizzazione integrate). - **Program.cs** — entry point WinForms standard, avvia `Form1`. - **Form1.cs** / **Form1.Designer.cs** — finestra principale. La UI è costruita interamente in codice in `Form1.BuildUi()` (nessun designer visuale usato); i controlli sono campi privati (`_txtCerca`, `_cmbTipo`, `_cmbCartella`, `_chkUltima`, `_grid`, ecc.). `Form1.Designer.cs` contiene solo lo scheletro minimo (`InitializeComponent`/`Dispose`) generato dal template. - **Indexer.cs** — logica di scansione del disco e scrittura/aggiornamento del DB SQLite (`Indexer.ScanAsync`). Cammina le 4 cartelle radice (`Indexer.CartelleRadice`) con un walk manuale a stack (`Walk`, più veloce di `EnumerateFiles(..., AllDirectories)` su share di rete con centinaia di migliaia di file), estrae da ogni nome file il pattern Pro-E `..` via regex, e fa un upsert incrementale riga per riga (confronto per `percorso_completo` + dimensione + data modifica). Riporta il progresso tramite `IProgress`, marshalato automaticamente sul thread UI. Contiene anche lo schema SQL del DB (tabella `files` + vista `files_ultima_versione`, che seleziona solo l'ultima versione per `(cartella_radice, codice, tipo_file)` usando `ROW_NUMBER() OVER (...)` — non un self-join con `GROUP BY`, che su ~200k righe degenera in tempi quasi quadratici). - **ProgressForm.cs** — dialog modale mostrato durante l'aggiornamento indice: barra di progresso, conteggi nuovi/aggiornati/invariati/rimossi, tempo trascorso e stima del tempo rimanente (calcolata dal ritmo file/secondo rispetto al totale atteso, preso dal conteggio della scansione precedente salvato nel DB). ### Schema del DB (`cad_index.db`) Tabella `files`: un record per ogni file trovato, con `percorso_completo` (chiave univoca), `cartella_radice`, `famiglia` (primo livello di sottocartella), `codice`/`tipo_file`/`versione` estratti dal nome file, dimensione, data modifica e timestamp dell'ultima scansione (`scansionato_il`, usato per rilevare ed eliminare i file non più presenti su disco a fine scansione). Vista `files_ultima_versione`: stessa struttura, filtrata alla sola versione più recente per codice+tipo. ### Comportamento di ricerca di default La ricerca di default (nessun filtro esplicito dall'utente) mostra solo i tipi `prt`/`asm` e solo l'ultima versione — vedi `OpzionePrtAsm`/`TipiPredefiniti` in `Form1.cs`. L'utente può comunque scegliere "Tutti i tipi" o un tipo specifico dal combo, e togliere la spunta "Solo ultima versione". ### Percorso del DB All'avvio la app cerca `cad_index.db` accanto all'eseguibile o nella working directory corrente; se non lo trova, l'utente può selezionarlo con "Apri DB...". Il bottone "Aggiorna indice" rilancia `Indexer.ScanAsync` sullo stesso path (radice disco di default `X:\`, hardcoded in `Form1.RadiceDiscoDefault`).