Vytvoření, smazání, zjištění zda složka existuje je určitě jedna z využitelných věcí. Navíc si ukážeme jak získat obsah některé ze složek, zkusíme vypsat seznam souborů a složek do konzolového okna a ukážeme si využití atribut. Jednotlivé kroky si nejprve ukážeme a následně vysvětlíme.
Co je potřeba?
Zjištění, zda složka existuje
if( GetFileAttributes( "C:/slozka/" ) == INVALID_FILE_ATTRIBUTES ) { printf("slozka neexistuje\n" ); }else{ printf("slozka existuje\n" ); }
Tato funkce nám vrátí atributy zadaného souboru nebo složky. Pokud složka nebo soubor neexistuje, vrátí nám hodnotu
INVALID_FILE_ATTRIBUTES.
Jejím jediným argumentem je právě cíl na onu složku, či soubor.
Vytvoření složky
mkdir( "nova slozka" );
Zcela jednoduché vytvoření složky, kde je parametrem adresa. Například "C:/moje_slozka" vytvoří novou složku na oddílu C. Pokud už složka existuje, nevykoná se nic.
Funkcí nelze vytvořit více složek naráz. Kdyby bylo potřeba vytvořit strom složek, vypadalo by to asi takto:
mkdir( "nova slozka" ); mkdir( "nova slozka/druha slozka" ); mkdir( "nova slozka/druha slozka/treti slozka" ); mkdir( "nova slozka/druha slozka/ctvrta slozka" );
Smazání složky
RemoveDirectory( "nova slozka" );
Další, velmi jednoduché použití funkce, kde zadáváme parametr jako adresu složky, kterou chceme odstranit i s jejím obsahem.
Pokud proběhne smazání úspěšně, funkce nám vrátí hodnotu true, v opačném případě false.
Prohledání obsahu složky a jeho výpis do konzole
WIN32_FIND_DATA NalezenaData; HANDLE hFind = FindFirstFile( "C:/*", &NalezenaData); if( (int)hFind == -1 ) return 0;
Prvně je opět potřeba vytvořit prostor pro uložení nalezených dat. Tento prostor si nazveme NalezenaData a je typu WIN32_FIND_DATA. Jedná se o strukturu dat, obsahující název nalezeného souboru/složky, jeho atributy a další jiné informace.
Při hledání vždy začínáme funkcí FindFirstFile() pomocí které nastavíme vyhledávání, získáme první nalezená data a také HANDLE, neboli pointer vyhledávače. Pokud funkce nenalezla nic, hFind bude v hodnotě -1. A abysme zabráníli pokračování scriptu, vytvořili jsme podmínku (řádek 3), kde bylo nutností získat číslo z pointeru hFind. To jsme uskutečnili převodem typu na integer (int).
První parametr funkce FindFirstFile() nastavuje adresu vyhledávání a znak * říka, že chceme vyhledat všechny soubory a složky. V případě že chceme vyhledat jedině soubory se zvolenou příponou, zapíšeme adresu například takto: "C:/*.txt" - nyní nám vyhledávač vyhledá pouze soubory s příponou txt.
Druhý parametr vyžaduje pointer na naši připravenou pamět pro první nalezená data. Znaménkem & získáme pointer.
do{ printf("%s\n", NalezenaData.cFileName ); }while( FindNextFile( hFind, &NalezenaData ) ); FindClose( hFind );
Nyní použijeme smyčku pro vyhledání a následné vypsání všech nalezených souborů.
Použil jsem pro tuto situaci do while(), aby jsme vypsali do konzole první, už nalezená data a později dále nalezená, pomocí funkce FindNextFile().
(Očekávám znalost cyklu do while() ).
Název souboru nebo složky získáme, jak už jsem zmínil, ze struktury NalezenaData a vybranou položkou cFileName. Lze z této struktury získat i například čas vytvoření - ftCreationTime nebo velikost souboru v bytech - nFileSizeLow.
Do while() jsme jako podmínku vložili rovnou funkci FindNextFile(), která vrací false, pokud už žádný další soubor nenalezne. Tímto cyklus ukončí. V opačném případě vrací hodnotu true a cyklus se nadále opakuje s výpisem dat do konzole.
Jeho prvním argumentem je náš HANDLE hFind a druhý argument slouží pro uložení dat nově nalezeného souboru/složky, obdobně jako u funkce FindFileFirst().
Nakonec vyhledávač ukončíme a smažeme funkcí FindClose().
Filtrování položek pomocí dwFileAttributes
do{ if( FindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY ) printf("Slozka: %s\n", FindFileData.cFileName); else if( FindFileData.dwFileAttributes & FILE_ATTRIBUTE_HIDDEN ) printf("Skryta polozka: %s\n", FindFileData.cFileName); else printf("Soubor: %s\n", FindFileData.cFileName); }while( FindNextFile(hFind, &FindFileData) );
Vyfiltrování položek zajistíme bitovým součinem (tj. znaménko &) atributu nalezené položky s konstantou v podmínce.
Ukázka části scriptu vypíše zda jde o složku, skrytou položkou nebo obyčejný soubor.
Seznam atribut (popisovat je snad ani nemusím):
FILE_ATTRIBUTE_READONLY
FILE_ATTRIBUTE_HIDDEN
FILE_ATTRIBUTE_SYSTEM
FILE_ATTRIBUTE_DIRECTORY
FILE_ATTRIBUTE_ARCHIVE
FILE_ATTRIBUTE_DEVICE
FILE_ATTRIBUTE_NORMAL
FILE_ATTRIBUTE_TEMPORARY
FILE_ATTRIBUTE_SPARSE_FILE
FILE_ATTRIBUTE_REPARSE_POINT
FILE_ATTRIBUTE_COMPRESSED
FILE_ATTRIBUTE_OFFLINE
FILE_ATTRIBUTE_NOT_CONTENT_INDEXED
FILE_ATTRIBUTE_ENCRYPTED
FILE_ATTRIBUTE_VIRTUAL
Komentáře