..::int SHFileOperation(LPSHFILEOPSTRUCT lpFileOp );::..

Funkce slouží ke kopírování, přesunutí, přejmenování a mazání souborů a adresářů. Pro to existují samozřejmě i další API funkce, ale tato narozdíl od nich zobrazuje i dialog s průběhem dané akce. (Ten samý co znáte z průzkumníka.)

Jejím jediným parametrem je ukazatel na strukturu SHFILEOPSTRUCT, která určuje co funkce dělá. Následuje popis jejích složek. Nás budou zajímat hlavně čtyři z nich jak uvidíte v příkladech na konci článku.

Prvky struktury SHFILEOPSTRUCT

typedef struct _SHFILEOPSTRUCT

{

HWND hwnd;

UINT wFunc;

LPCSTR pFrom;

LPCSTR pTo;

FILEOP_FLAGS fFlags;

BOOL fAnyOperationsAborted;

LPVOID hNameMappings;

LPCSTR lpszProgressTitle;

} SHFILEOPSTRUCT, FAR *LPSHFILEOPSTRUCT;

hwnd

Handle okna, kde se mají zobrazovat informace o průběhu. (Můžete nastavit na 0.)

wFunc

Hodnota tohoto parametru určuje, jaká operace se má provádět. Lze použít následující čtyři konstanty: FO_COPY, FO_DELETE, FO_MOVE, FO_RENAME. Řekl bych, že názvy konstant mluví samy za sebe.

pFrom

Ukazatel na buffer obsahující názvy souborů, se kterými se má manipulovat. Každý název souboru je ukončen znakem \0. Celý seznam je pak ukončen dvěma znaky \0. Seznam souborů lze také specifikovat pomocí klasické hvězdičkové konvence.

pTo

Ve většině případů je hodnotou tohoto parametru adresář, kam soubory zkopírovat/přemístit. V případě mazání je tento parametr ignorován. Zajímavou možností je použít vlajku FOF_MULTIDESTFILES (viz níže) - pak je hodnotou parametru seznam souborů zapsaný ve stejném formátu jako u pFrom a funkce zkopíruje/přejmenuje soubory z pFrom na soubory na odpovídajících místech seznamu pTo.

fFlags

Vlajky upřesňující provedení operace. Hodnotou je součet libovolných z následujících konstant:

FOF_ALLOWUNDO V helpu je napsáno, že použití této vlajky zachovává informaci pro undo. Praktický význam je, že použití této vlajky při mazání maže soubory do koše, nikoliv přímo z harddisku.
FOF_FILESONLY Pokud je v pFrom použita hvězdičková konvence, nezahrnou se do výběru adresáře.
FOF_MULTIDESTFILES Signalizuje, že v pTo je použit seznam souborů místo adresáře.
FOF_NOCONFIRMATION Nezobrazuje žádné potvrzovací dialogy (při kolizích jmen souborů apod.), automaticky předpokládá odpověď "Ano".
FOF_NOCONFIRMMKDIR Nevyžaduje potvrzení vytvoření nového adresáře.
FOF_NOERRORUI Pokud nastane nějaká chyba, nezobrazí se dialog, který o tom inforuje uživatele.
FOF_RENAMEONCOLLISION Pokud při kopírování/přesunu dojde ke kolizi jmen (tj. cílový soubor už bude existovat), jméno cílového souboru se upraví (např. v českých Windiws se přidá předpona "Kopie - ").
FOF_SILENT Naní zobrazován dialog s průběhem operace (defaultně zobrazován vždy je!)
FOF_SIMPLEPROGRESS Je zobrazena jen zjednodušená verze dialogu s průběhem operace (nejsou zobrazena jména jednotlivých souborů).

Poznámka 1: Nepopisoval jsem vlajky FOF_CONFIRMMOUSE, FOF_NOCOPYSECURITYATTRIBS a FOF_WANTMAPPINGHANDLE, protože je velmi pravděpodobně nevyužijete. Jejich popis zájemci najdou v nápovědě.

Poznámka 2: Typ FILEOP_FLAGS (tedy typ proměnné fFlags) je definován jako Word.

fAnyOperationsAborted

Tato položka je výstupní - po volání funkce je zde hodnota TRUE, pokud uživatel některou z operací přeruší kliknutím na tlačítko Storno. Pokud ne, je zde vrácena hodnota False.

hNameMappings

Pravděpodobně nebudete potřebovat. Funkce zde (pokud použijete vlajku FOF_WANTMAPPINGHANDLE) vrací ve speciálním formátu seznam starých a nových jmen všech souborů

lpszProgressTitle

Nadpis dialogu s průběhem operace. Tento parametr je ignorován, pokud není nastavena vlajka FOF_SIMPLEPROGRESS.

Příklady:


Kopírování souborů:


SHFILEOPSTRUCT s;

ZeroMemory(&s,sizeof(s));    // Vyprázdnění obsahu struktury

s.wFunc = FO_COPY;          // Kopírování

s.pFrom = "c:\\test\\*.*\0";        // Odkud - Obsah adresáře c.\test (včetně podadresářů protože není specifikován flag FOF_FILESONLY)

s.pTo = "c:\\test1\0";                // Kam - Do adresáře c:\test1

s.fFlags = FOF_ALLOWUNDO;

SHFileOperation(&s);


Mazání souborů:


SHFILEOPSTRUCT s;

ZeroMemory(&s,sizeof(s));    // Vyprázdnění obsahu struktury

s.wFunc = FO_DELETE;          // Mazání

s.pFrom = "c:\\test\\*.*\0";        // Co - Obsah adresáře c.\test (včetně podadresářů protože není specifikován flag FOF_FILESONLY)

s.fFlags = FOF_ALLOWUNDO;    // Způsobí vymazání souborů do koše, jinak se smažou úplně

SHFileOperation(&s);

Textové řetězce určující soubory se kterými se má operace provádět jsou ukončeny znakem \0, protože funkce SHFileOperation vyžaduje, aby byly ukončeny dvěma znaky \0. Druhý přidá kompilátor, protože to dělá u každé textové konstanty.