Funzioni _find, _wfind
Queste funzioni cercano e chiudono le ricerche dei nomi file specificati:
Note
La funzione _findfirst fornisce informazioni sulla prima istanza di un nome file che corrisponde al file specificato nell'argomento di filespec. È possibile utilizzare in filespec qualsiasi combinazione di caratteri jolly supportata dal sistema operativo host.
Le funzioni restituiscono le informazioni del file in una struttura _finddata_t definita in IO.h. Le varie funzioni della famiglia utilizzano molte varianti sulla struttura _finddata_t. La struttura _finddata_t di base include i seguenti elementi:
unsigned attrib
Attributo filetime_t time_create
Ora della creazione del file (- 1L per i file system FAT). L'ora viene archiviata in formato UTC. Per convertirla nell'ora locale, utilizzare localtime_s.time_t time_access
Ora dell'ultimo accesso al file (- 1L per i file system FAT). L'ora viene archiviata in formato UTC. Per convertirla nell'ora locale, utilizzare localtime_s.time_t time_write
L'ora dell'ultima scrittura sul file. L'ora viene archiviata in formato UTC. Per convertirla nell'ora locale, utilizzare localtime_s._fsize_t size
Lunghezza del file in byte.char name [ _MAX_PATH]
Nome con terminazione null del corrispondente file o directory, senza il percorso.
In file system che non supportano le ore di creazione e di ultimo accesso di un file, ad esempio il sistema FAT, i campi time_create e time_access sono sempre - 1L.
_MAX_PATH è definito in Stdlib.h come 260 byte.
Non è possibile specificare attributi target (come _A_RDONLY) per limitare l'operazione di ricerca. Questi attributi vengono restituiti nel campo attrib della struttura di _finddata_t e possono disporre dei seguenti valori (definiti in IO.h). Gli utenti non devono fare affidamento sul fatto che questi siano gli unici valori possibili per il campo di attrib.
_A_ARCH
Archiviare. Da impostare ogni volta che il file viene modificato e cancellato dal comando BACKUP. Valore: 0x20._A_HIDDEN
File nascosti. In genere non vengono visualizzati con il comando DIR, a meno che non si utilizzi l'opzione /AH. Restituisce informazioni su file normali e file con questo attributo. Valore: 0x02._A_NORMAL
Normale. Nel file non sono stati impostati altri attributi ed è possibile leggere o scrivere sul file senza restrizione. Valore: 0x00._A_RDONLY
Sola lettura. Il file non può essere aperto per la scrittura e non può essere creato un file con lo stesso nome. Valore: 0x01._A_SUBDIR
Sottodirectory. Valore: 0x10._A_SYSTEM
File di sistema. In genere non vengono visualizzati con il comando DIR, a meno che venga utilizzata l'opzione /A o /A:S. Valore: 0x04.
_findnext cerca, se presente, il nome successivo che corrisponde all'argomento filespec specificato in una chiamata precedente a _findfirst. L'argomento di fileinfo deve puntare a una struttura inizializzata dalla chiamata precedente a _findfirst. Se viene individuata una corrispondenza, il contenuto della struttura fileinfo viene modificato come descritto in precedenza. In caso contrario, viene lasciato invariato. _findclose chiude un handle di ricerca specificato e libera tutte le risorse collegate sia per _findfirst che _findnext. L'handle restituito da _findfirst o da _findnext deve essere prima di tutto passato a _findclose, prima che le operazioni di modifica, ad esempio l'eliminazione, possano essere eseguite sulle directory che costituiscono i percorsi che vengono passati ad essi.
È possibile annidare le funzioni _find. Ad esempio, se una chiamata a _findfirst o a _findnext trova il file che è una sottodirectory, una nuova ricerca può essere avviata con un'altra chiamata a _findfirst o a _findnext.
_wfindfirst e _wfindnext sono versioni a caratteri estesi di _findfirst e di _findnext. L'argomento della struttura della versione a caratteri estesi ha il tipo di dati _wfinddata_t, definito in IO.h e in Wchar.h. I campi di questo tipo di dati sono uguali a quelli del tipo di dati di _finddata_t, con la differenza che in _wfinddata_t il campo del nome è di tipo wchar_t anziché di tipo char. Altrimenti _wfindfirst e _wfindnext si comportano in modo identico a _findfirst e a _findnext.
_findfirst e _findnext utilizzano il tipo di ora a 64 bit. Se è necessario utilizzare il tipo di ora precedente a 32 bit, è possibile definire _USE_32BIT_TIME_T. Le versioni di queste funzioni con il suffisso 32 nei relativi nomi utilizzano il tipo di ora a 32 bit e quelli con il suffisso 64 utilizzano il tipo di ora a 64 bit.
Anche le funzioni _findfirst32i64, _findnext32i64, _wfindfirst32i64 e _wfindnext32i64 si comportano in modo identico a alle versioni del tipo di ora a 32 bit di queste funzioni tranne per il fatto che utilizzano e restituiscono le lunghezze del file in 64 bit. Le funzioni _findfirst64i32, _findnext64i32, _wfindfirst64i32 e _wfindnext64i32utilizzano le lunghezze del file a 32 bit di tipo ma utilizzano i tipi di tempo a 64 bit. Tali funzioni utilizzano variazioni appropriate del tipo _finddata_t in cui i campi hanno tipi diversi per l'ora e la dimensione del file.
_finddata_t è in realtà una macro che dà viene valutata a _finddata64i32_t (o a _finddata32_t se _USE_32BIT_TIME_T è definito). Nella tabella riportata di seguito vengono riepilogate le versioni di _finddata_t:
Struttura |
Tipo time |
Tipo di dimensione del file |
---|---|---|
_finddata_t, _wfinddata_t |
__time64_t |
_fsize_t |
_finddata32_t, _wfinddata32_t |
__time32_t |
_fsize_t |
__finddata64_t, __wfinddata64_t |
__time64_t |
__int64 |
_finddata32i64_t, _wfinddata32i64_t |
__time32_t |
__int64 |
_finddata64i32_t, _wfinddata64i32_t |
__time64_t |
_fsize_t |
_fsize_t è un typedef per unsigned long (32 bit).
Esempio
// crt_find.c
// This program uses the 32-bit _find functions to print
// a list of all files (and their attributes) with a .C extension
// in the current directory.
#include <stdio.h>
#include <stdlib.h>
#include <io.h>
#include <time.h>
int main( void )
{
struct _finddata_t c_file;
intptr_t hFile;
// Find first .c file in current directory
if( (hFile = _findfirst( "*.c", &c_file )) == -1L )
printf( "No *.c files in current directory!\n" );
else
{
printf( "Listing of .c files\n\n" );
printf( "RDO HID SYS ARC FILE DATE %25c SIZE\n", ' ' );
printf( "--- --- --- --- ---- ---- %25c ----\n", ' ' );
do {
char buffer[30];
printf( ( c_file.attrib & _A_RDONLY ) ? " Y " : " N " );
printf( ( c_file.attrib & _A_HIDDEN ) ? " Y " : " N " );
printf( ( c_file.attrib & _A_SYSTEM ) ? " Y " : " N " );
printf( ( c_file.attrib & _A_ARCH ) ? " Y " : " N " );
ctime_s( buffer, _countof(buffer), &c_file.time_write );
printf( " %-12s %.24s %9ld\n",
c_file.name, buffer, c_file.size );
} while( _findnext( hFile, &c_file ) == 0 );
_findclose( hFile );
}
}