C++ / WinAPI - Výpis názvů všech souborů ve složce

C++ / WinAPI - Výpis názvů všech souborů ve složce

Příspěvekod Wlezley » 26 září 2011 16:06:18

Jednoduchý program pro výpis souborů ve složce. Používám funkci FindFirstFile() a FindNextFile(), kterými hledám výraz *.* (všechny soubory). Všeobecně se to používá pro vyhledávání souborů. Získaná data se ukládají do struktury WIN32_FIND_DATA, která poskytuje širokou škálu informací o nalezených souborech.

Zdrojový kód programu:
http://paste.wlezley.eu/index.php/view/82519966

Struktura WIN32_FIND_DATA:
Kód: Vybrat vše
typedef struct _WIN32_FIND_DATA {
  DWORD    dwFileAttributes;
  FILETIME ftCreationTime;
  FILETIME ftLastAccessTime;
  FILETIME ftLastWriteTime;
  DWORD    nFileSizeHigh;
  DWORD    nFileSizeLow;
  DWORD    dwReserved0;
  DWORD    dwReserved1;
  TCHAR    cFileName[MAX_PATH];
  TCHAR    cAlternateFileName[14];
} WIN32_FIND_DATA, *PWIN32_FIND_DATA, *LPWIN32_FIND_DATA;

dwFileAttributes
Atributy souborů:
  • FILE_ATTRIBUTE_READONLY 1 (0x1) - Soubor je pouze pro čtení. Aplikace můžou ze souboru číst, ale nemohou do něj zapisovat ani ho smazat. Tento atribut není zastoupen u adresářů.
  • FILE_ATTRIBUTE_HIDDEN 2 (0x2) - Skrytý soubor nebo složka. (Soubor nebo složka není v běžném výpisu adresáře vidět).
  • FILE_ATTRIBUTE_SYSTEM 4 (0x4) - Systémový soubor nebo adresář (částečně nebo výhradně využit operačním systémem).
  • FILE_ATTRIBUTE_DIRECTORY 16 (0x10) - Handler označující adresář (tzn. že nalezená položka není soubor).
  • FILE_ATTRIBUTE_ARCHIVE 32 (0x20) - Soubor nebo adresář, určený k archivaci. Aplikace obvykle používají tento atribut k označení souborů pro zálohování nebo odstranění.
  • FILE_ATTRIBUTE_DEVICE 64 (0x40) - Tato hodnota je vyhrazena pro použití systému.
  • FILE_ATTRIBUTE_NORMAL 128 (0x80) - Soubor, který nemá jiné nastavení atributů. Tento atribut je platný pouze při samostatném použití.
  • FILE_ATTRIBUTE_TEMPORARY 256 (0x100) - Dočasný soubor. Souborový systém zabraňuje zápisu dat na mass storage (úložiště, obvykle pedný disk) je-li k dispozici dostatek vyrovnávací paměti, protože aplikace obvykle odstraní dočasný soubor po uzavření handleru. V tomto případě může systém zcela zabránit zápisu dat na mass storage. V opačném případě budou po ukončení handle data zapsána.
  • FILE_ATTRIBUTE_SPARSE_FILE 512 (0x200) - Rozptýlený soubor.
  • FILE_ATTRIBUTE_REPARSE_POINT 1024 (0x400) - Soubor nebo adresář, který má přidružený bod změny zpracování, nebo soubor, který je symbolickým odkazem. (LNK)
  • FILE_ATTRIBUTE_COMPRESSED 2048 (0x800) - Soubor nebo adresář, který je komprimovaný. U souborů jsou komprimována všechna data. U adresářů je komprese výchozí pro nově vytvořené soubory a podadresáře.
  • FILE_ATTRIBUTE_OFFLINE 4096 (0x1000) - Data souboru nejsou k dispozici okamžitě. To znamená, že data souboru jsou fyzicky přesunuta do offline úložiště. Tento atribut je používán zejména Vzdáleným Úložištěm (Remote Storage), což je software pro hierarchickou správu úložiště. Aplikace by neměla svévolně měnit tento atribut.
  • FILE_ATTRIBUTE_NOT_CONTENT_INDEXED 8192 (0x2000) - Soubor nebo adresář, který nemá být indexován službou indexování obsahu.
  • FILE_ATTRIBUTE_ENCRYPTED 16384 (0x4000) - Soubor nebo adresář, který je šifrován. U souborů jsou šifrovány všechny datové proudy v souboru. U adresářů je šifrování výchozí pro nově vytvořené soubory a podadresáře.
  • FILE_ATTRIBUTE_VIRTUAL 65536 (0x10000) - Tato hodnota je vyhrazena pro použití systému.

ftCreationTime
Struktura FILETIME obsahující datum a čas kdy byl soubor nebo adresář vytvořen.
Pokud základní systém souborů nepodporuje čas vytvoření, tento člen je nulový.

ftLastAccessTime
Struktura FILETIME.
U souborů tato struktura určuje, kdy bylo ze souboru naposledy čteno, do něj zapisováno, nebo (u spustitelných souborů) kdy byl naposledy spoušten.
U adresářů struktura určuje, kdy byl adresář vytvořen. Pokud základní systém souborů nepodporuje čas posledního přístupu, tento člen je nulový.
V systému souborů FAT, se zanamenává jen datum; čas je vždy nastaven na půlnoc (00:00).

ftLastWriteTime
Struktura FILETIME.
U souborů tato struktura určuje, kdy bylo do souboru naposledy zapisováno, kdy byl zkrácen nebo přepsán; např. když jsou použity funkce WriteFile() nebo SetEndOfFile(). Datum a čas nejsou aktualizovány, pokud se změní atributy souborů nebo popisovače zabezpečení (security descriptors).
U adresářů struktura určuje, kdy byl adresář vytvořen. Pokud základní systém souborů nepodporuje čas posledního zápisu, tento člen je nulový.

nFileSizeHigh
High-order DWORD hodnota velikosti souboru v bytech.
Tato hodnota je nulová, pokud velikost souboru je větší než MAXDWORD.
Velikost souboru je rovna (nFileSizeHigh * (MAXDWORD+1)) + nFileSizeLow.

nFileSizeLow
Low-order DWORD hodnota velikosti souboru v bytech.

dwReserved0
Pokud člen dwFileAttributes zahrnuje atribut FILE_ATTRIBUTE_REPARSE_POINT, pak tento člen stanovuje tag bodu změny zpracování.
V opačném případě tato hodnota není definovaná a neměla by se používat.
Pro více informací viz. Reparse Point Tags.
  • IO_REPARSE_TAG_DFS (0x8000000A)
  • IO_REPARSE_TAG_DFSR (0x80000012)
  • IO_REPARSE_TAG_HSM (0xC0000004)
  • IO_REPARSE_TAG_HSM2 (0x80000006)
  • IO_REPARSE_TAG_MOUNT_POINT (0xA0000003)
  • IO_REPARSE_TAG_SIS (0x80000007)
  • IO_REPARSE_TAG_SYMLINK (0xA000000C)

dwReserved1
Rezervováno pro budoucí použití ...

cFileName
Celý název souboru.

cAlternateFileName
Alternativní jméno souboru (ve formátu 8.3 jak známe z MS-DOS, FAT, ... ).

Struktura FILETIME:
Kód: Vybrat vše
typedef struct _FILETIME {
  DWORD dwLowDateTime;
  DWORD dwHighDateTime;
} FILETIME, *PFILETIME;

dwLowDateTime
Low-order část času souboru.

dwHighDateTime
High-order část času souboru.


Nic složitýho na tom není. :diablo:
Uživatelský avatar
Wlezley
 
Příspěvky: 316
Registrován: 24 září 2011 22:54:46
Bydliště: Plzeň
Projekt: Wlezley EU

Re: C++ / WinAPI - Výpis názvů všech souborů ve složce

Příspěvekod galatex » 15 březen 2013 21:01:37

Ahoj,mrkl jsem se an tvoje forum a nasel jsem pro me uzitecny script na vypsani vsech souboru ve složce... bohuzel sript nedal to co ma(teda aspon myslím :D) sice správně spočít soubory,ale místo jmen vypíše např... 001CEDEC a pod tím 001CEDEC to samé když jsou ve složce dva soubory... a to i když jsou s jiným jménem.Jen by mě zajímalo čím by to mohlo být.

EDIT: je to kopie zprávy,kterou jsem ti již poslal...Více informací k tomu to problému nemám,protože v ničem jiném problém není...Já jsem chtěl tento script zkusit poupravit aby do jiného souboru vypsal ty názvy souborů a knim tobě určitě znamé funkce pro bat soubory ( type "2013_02_25_04_auth_misc.sql" >> "novy.sql" ) ,k čemuž se ale nedostanu,když mi to vypisuje to,co mi to vypisuje... Prostě kus nějakého kodu,který je navíc stejný napr pro 50 ruzne pojmenovanych souboru,coz je na tom nejdivnejsi:) pouzivam VS C++ 2008 Express edition

Za radu děkuji.
S pozdravem nováček v sriptování Galatex.
PS:Jo a pokud mám někde blbou chybu,kterou bych měl být schopný opravit sám,tak ne že mě ukamenuješ :D

Obrázek
galatex
 
Příspěvky: 3
Registrován: 15 březen 2013 20:51:37

Re: C++ / WinAPI - Výpis názvů všech souborů ve složce

Příspěvekod Wlezley » 16 březen 2013 02:15:55

Nastav si projekt ve Visual C++, tenhle kód asi nebude pro Unicode, ale pro Multi-Byte. Tak si nastav charset a zkus to.
Nebo hoď kód na paste a dej sem link, kdyby to nešlo.
Každopádně ti to vypisuje adresu stringu, né string sanotnej. Párkrát se mi to taky stalo, je třeba umět pracovat se stringama (string).
Bez kódu ti víc poradit nemůžu. Zkusím znovu zkompilovat ten kód co mám uplně nahoře v prvním přízpěvku, ale vím že jsem to tehdy zkoučel a bylo to v pohodě.

Hoď kód a budu chytřejší. :thumbup:

PS: Jakej OS používáš? Jakej máš .NET framework?
Uživatelský avatar
Wlezley
 
Příspěvky: 316
Registrován: 24 září 2011 22:54:46
Bydliště: Plzeň
Projekt: Wlezley EU

Re: C++ / WinAPI - Výpis názvů všech souborů ve složce

Příspěvekod galatex » 16 březen 2013 10:13:15

No vidíš :) já ani netušil,jak poznat (dokonce ani jak nastavit) jiné formátování...No trochu jsem pogooglil našel jak nastavit charset na Multi-byte,prásk a kód funguje jak by měl :) jsem věděl,že to bude nějaká kravina :D jinakabych i přes to odpověděl kód mám úplně stejnej jako je nahoře z Paste pouze s přidáním #include "stdafx.h" ... OS mám Windows 7 a .NET framework bych měl mít asi nejnovější kvůli nedávnému přeinstalování windowsu z vist na 7 a tak nové instalaci všem potřebných věcí k MVSC++ ,ale jinak je to (pokud se nepletu) verze 3.5.

A jinak moc dík za radu...možná se tu ještě nějaké prosby o pomoc ukážou :)
galatex
 
Příspěvky: 3
Registrován: 15 březen 2013 20:51:37

Re: C++ / WinAPI - Výpis názvů všech souborů ve složce

Příspěvekod Wlezley » 16 březen 2013 12:20:51

Nejnovější .NET framework není 3.5 a přechodem z Win Vista na Win 7 nezískáš vyšší. Už je verze 4 a verze 4.5. :)

Jsem rád že ti to funguje. Já používám vždycky kódování Multi-byte, líp se mi s ním pracuje. Kdybys chtěl používat Unicode, musel by ses naučit používat wchar, funkce WinAPI pro Unicode, převody z widechar na char (a naopak) atd... Já jsem to ze začátku dělal v Unicode, ale rychle jsem od toho utekl, protože je s tím vážně hodně práce (a celkem zbytečné, když Unicode nepotřebuješ). :)

PS: Kdybys používal Unicode, myslím že stačí používat místo:
RAW CODE
cout << promenna;
toto:
RAW CODE
wcout << promenna;


Ale jak říkám, já unicode nepoužívám, nemám ho rád (kvůli proměnné délce znaků = některé znaky mají 1bajt, některé mají 2 (pro UTF-16 mají i 4 bajty myslím...)).
Uživatelský avatar
Wlezley
 
Příspěvky: 316
Registrován: 24 září 2011 22:54:46
Bydliště: Plzeň
Projekt: Wlezley EU

Re: C++ / WinAPI - Výpis názvů všech souborů ve složce

Příspěvekod galatex » 16 březen 2013 18:10:20

Ja nemyslel,ze prechodem na w7 ziskam lepsi .NET framework ,ale myslel jsem to tak,ze po reinstalaci jsem musel naistalovat novy... Ono ani nevim jestli mam vazne jen 3.5 nebo jaky,tu 3.5ku mi ukazalo MVSC++ ktery mi to v nastaveni ukazalo kdyz jsem si nastavoval to kodovani...jinak ja zatim nerozeznavam rozdily v tom kodovanim...Ono zatim jsem rad ze zvladnu vytvorit nejaky kod a neco malo upravit v jiz udelanych kodech.Napr. jsem chtel pomoci tveho kodu slozitym zpusobem udelat to co se da udelat pomoci souboru.bat :D ale nez jsem na to prisel,tak jsem si rozsiril moznosti c++,no co jen doufam,ze jsem te tim moc neotravoval a jinak pokracuj ve skvele praci :D
BTW:programovani me chytlo uz drive,ale to jsem nebyl ani schopny zkompilovat svuj vlastni wow server a musel jsem pouzit tvuj repack ;) takze dal pomahej ostatnim svymi scripty dik :thumbup:

+ sorry za text bez diakritiky,na tabletu me nebavi to psat sni :)
galatex
 
Příspěvky: 3
Registrován: 15 březen 2013 20:51:37


Zpět na C/C++

Kdo je online

Uživatelé procházející toto fórum: Žádní registrovaní uživatelé a 1 návštěvník


cron