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.
typedef struct _SHFILEOPSTRUCT
{
HWND hwnd;
UINT wFunc;
LPCSTR pFrom;
LPCSTR pTo;
FILEOP_FLAGS fFlags;
BOOL fAnyOperationsAborted;
LPVOID hNameMappings;
LPCSTR lpszProgressTitle;
} SHFILEOPSTRUCT, FAR *LPSHFILEOPSTRUCT;
Handle okna, kde se mají zobrazovat informace o průběhu. (Můžete nastavit na 0.)
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.
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.
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.
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.
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.
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ů
Nadpis dialogu s průběhem operace. Tento parametr je ignorován, pokud není nastavena vlajka FOF_SIMPLEPROGRESS.
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);
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.