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?

  • Opět špetku znalostí v C/C++ a bitovým součinem.
  • Vhodný kompilátor (nejlépe vývojové prostředí MS Visual Studio)
  • Knihovny: windows.h  stdio.h  direct.h

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  

 
0 # Netroufnu 2013-08-08 09:37
Zdravím, jen by mě zajímalo jak pomocí funkce FindFirstFile vyhledám pouze složky, pokud to tedy jde. Díky za odpověď
Odpovědět | Odpovědět citací | Citovat
 
 
+1 # Henry 2013-08-09 13:21
Ano, děkuji za připomínku. Do článku jsem přidal Filtrování položek pomocí dwFileAttribute s, kde je popsáno více. :-)
Odpovědět | Odpovědět citací | Citovat