Na FreeHostingu Endora běží desítky tisíc webů. Přidejte se ještě dnes!

Vytvořit web zdarma

Na FreeHostingu Endora běží desítky tisíc webů. Přidejte se ještě dnes!

Vytvořit web zdarma

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