Różnice między wybraną wersją a wersją aktualną.
Both sides previous revision Previous revision Next revision | Previous revision Last revision Both sides next revision | ||
filesystem [2008/04/16 23:00] michal.wasiak |
filesystem [2008/04/16 23:30] michal.wasiak |
||
---|---|---|---|
Linia 1: | Linia 1: | ||
====== Biblioteka boost::filesystem ====== | ====== Biblioteka boost::filesystem ====== | ||
- | __wersja robocza__ | + | Michał Wasiak, ''//G1ISI//'' |
===== Wstęp ===== | ===== Wstęp ===== | ||
Biblioteka boost::filesystem wprowadza przenośne udogodnienia w zarządzaniu ścieżkami dostępu do katalogów i plików. | Biblioteka boost::filesystem wprowadza przenośne udogodnienia w zarządzaniu ścieżkami dostępu do katalogów i plików. | ||
Linia 65: | Linia 66: | ||
Funkcja najpierw sprawdza czy podana ścieżka w //path_dir// istnieje i jest katalogiem. Później tworzy obiekt //directory_iterator// podając ściężkę do konstruktora. Pętla iteruje po wszystkich elementach katalogu i dla każdego napotkanego podkatalogu wywołuje rekursywnie funkcję szukającą. Każdy rozpoznany plik jest porównywany co do nazwy z paramatrem //file_name// i jeśli znaleziony zostanie plik o podanej nazwie to do //path_found// kopiowana jest scieżka do tego pliku i zwracana jest wartość 'true'. Jeśli nic nie zostanie znalezione to zwrcana jest wartość 'false'. | Funkcja najpierw sprawdza czy podana ścieżka w //path_dir// istnieje i jest katalogiem. Później tworzy obiekt //directory_iterator// podając ściężkę do konstruktora. Pętla iteruje po wszystkich elementach katalogu i dla każdego napotkanego podkatalogu wywołuje rekursywnie funkcję szukającą. Każdy rozpoznany plik jest porównywany co do nazwy z paramatrem //file_name// i jeśli znaleziony zostanie plik o podanej nazwie to do //path_found// kopiowana jest scieżka do tego pliku i zwracana jest wartość 'true'. Jeśli nic nie zostanie znalezione to zwrcana jest wartość 'false'. | ||
- | ===== Gramatyka? ===== | + | |
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | ===== Formaty ścieżek ===== | ||
+ | Są dwa formaty łańcuchów opisujących ścieżkę dostępu: | ||
+ | * Przenośny format opisany przez POSIX; | ||
+ | * Natywny format ścieżki dostępu definiowany przez system operacyjny. Przykłady:\\ //OpenVMS:// ''"SYS1::DISK1:[DANE.FILMY]"''\\ //Windows:// ''"c:\dane\filmy"'' | ||
Linia 105: | Linia 117: | ||
template <class Path> typename Path::string_type extension(const Path & p); | template <class Path> typename Path::string_type extension(const Path & p); | ||
</code> | </code> | ||
- | Funkcja zwracająca rozszerzenie pliku. Jeśli ''p.leaf()'' zawiera kropkę, to funkcja zwraca podciąg z ''p.leaf()'' zaczynający się od ostatniej kropki aż do ostatniego znaku nazwy. W przeciwnym razie wypadku zwraca pusty łańcuch. | + | Funkcja zwracająca rozszerzenie pliku. Jeśli ''p.leaf()'' zawiera kropkę, to funkcja zwraca podciąg z ''p.leaf()'' od ostatniej kropki aż do ostatniego znaku nazwy. W przeciwnym razie zwraca pusty łańcuch. |
<code cpp> | <code cpp> | ||
template <class Path> typename Path::string_type basename(const Path & p); | template <class Path> typename Path::string_type basename(const Path & p); | ||
</code> | </code> | ||
- | Funkcja zwracająca nazwę pliku bez rozszerzenia. Jeśli ''p.leaf()'' zawiera kropkę, to funkcja zwraca podciąg z ''p.leaf()'' zaczynający się od początku nazwy do ostatniej kropki (kropka nie jest zawarta). W przeciwnym wypadku zwraca ''p.leaf()''.<code cpp> | + | Funkcja zwracająca nazwę pliku bez rozszerzenia. Jeśli ''p.leaf()'' zawiera kropkę, to funkcja zwraca podciąg z ''p.leaf()'' od początku nazwy do ostatniej kropki (kropka nie jest zawarta). W przeciwnym wypadku zwraca ''p.leaf()''. |
+ | <code cpp> | ||
template <class Path> Path replace_extension(const Path & p, const typename Path::string_type & new_extension); | template <class Path> Path replace_extension(const Path & p, const typename Path::string_type & new_extension); | ||
</code> | </code> | ||
Funkcja zmienia rozszerzenie pliku //p// na nowe //new_extension//. | Funkcja zmienia rozszerzenie pliku //p// na nowe //new_extension//. | ||
+ | |||
Linia 122: | Linia 136: | ||
void listing(const bf::path& p) { | void listing(const bf::path& p) { | ||
- | unsigned long dir_count = 0; | + | unsigned long dir_count = 0; |
- | unsigned long file_count = 0; | + | unsigned long file_count = 0; |
- | unsigned long other_count = 0; | + | unsigned long other_count = 0; |
- | unsigned long err_count = 0; | + | unsigned long err_count = 0; |
- | if(!bf::exists(p)) { | + | if(!bf::exists(p)) { |
- | std::cout << "Nieprawidlowa sciezka: " << p.native_file_string() << std::endl; | + | std::cout << "Nieprawidlowa sciezka: " << p.native_file_string() << std::endl; |
- | return; | + | return; |
- | } | + | } |
- | if(bf::is_directory(p)) { | + | if(bf::is_directory(p)) { |
- | std::cout << "W katalogu: " << p.native_file_string() << "\n\n"; | + | std::cout << "W katalogu: " << p.native_file_string() << "\n\n"; |
- | bf::directory_iterator iter(p), end_iter; | + | bf::directory_iterator iter(p), end_iter; |
- | for(; iter != end_iter; ++iter) { | + | for(; iter != end_iter; ++iter) { |
- | try { | + | try { |
- | if(bf::is_directory(*iter)) { | + | if(bf::is_directory(*iter)) { |
- | ++dir_count; | + | ++dir_count; |
- | std::cout << iter->leaf() << " [katalog]\n"; | + | std::cout << iter->leaf() << " [katalog]\n"; |
- | } | + | } |
- | else if(fs::is_regular(iter->status())) { | + | else if(fs::is_regular(iter->status())) { |
- | ++file_count; | + | ++file_count; |
- | std::cout << iter->leaf() << " (" << bf::file_size(*iter) <<" B)\n"; | + | std::cout << iter->leaf() << " (" << bf::file_size(*iter) <<" B)\n"; |
- | } | + | } |
- | else { | + | else { |
- | +other_count; | + | ++other_count; |
- | std::cout << iter->leaf() << " [inny]\n"; | + | std::cout << iter->leaf() << " [inny]\n"; |
- | } | + | } |
- | } catch(const std::exception& ex) { | + | } catch(const std::exception& ex) { |
- | ++err_count; | + | ++err_count; |
- | std::cout << iter->leaf() << ": " << ex.what() << std::endl; | + | std::cout << iter->leaf() << ": " << ex.what() << std::endl; |
- | } | + | } |
- | } | + | } |
- | std::cout << std::endl << file_count << " plikow\n" | + | std::cout << std::endl << file_count << " plikow\n" |
- | << dir_count << " katalogow\n" | + | << dir_count << " katalogow\n" |
- | << other << " innych\n" | + | << other << " innych\n" |
- | << err_count << " błedów\n"; | + | << err_count << " błedów\n"; |
- | } | + | } |
- | else { // musi byc plikiem | + | else { // musi byc plikiem |
- | std::cout << "Plik: " << p.native_file_string() << std::endl; | + | std::cout << "Plik: " << p.native_file_string() << std::endl; |
- | } | + | } |
} | } | ||
</code> | </code> |