Qt - sprawdzanie i przeszukiwanie ścieżek dostępu do plików i folderów za pomocą klasy QDir
Stronę tą wyświetlono już: 2779 razy
Klasa QDir udostępnia szereg metod pozwalających na łatwe operowanie na ścieżkach dostępu, sprawdzaniu ich poprawności i wyszukiwaniu plików i folderów spełniających określone warunki filtrowania. W celu skorzystania z tej klasy konieczne jest oczywiście załączenie pliku QDir.
Metody statyczne
Metoda tworząca skróconą ścieżkę dostępu
Qt umożliwia tworzenie specjalnych ścieżek przeszukiwania, dzięki czemu można w znaczący sposób skrócić zapis w kodzie takiej ścieżki. Za pomocą metody addSerchPath można taką ścieżkę i jej znacznik dodać. Oto przykład:
- QString path = "C:/myFolders/icons";
- QString prefix = "icons";
- QDir::addSearchPath( prefix, path);
- QDir dir("icons:");
- qDebug() << dir.exists();
Powyższy kod wyświetli true pod warunkiem, że ścieżka C:/myFolders/icons istnieje na dysku twardym.
Upraszczanie zapisu ścieżki względnej
Metoda cleanPath upraszcza podaną na wejście ścieżkę względną pozbywając się wszystkich znaków .., ., które oznaczają foldery nadrzędne. Przykład działania:
- QDir dir = QDir::current();
- qDebug() << QDir::cleanPath("./release");
Powyższy kod wyświetli:
release
Metoda zwracająca i ustawiająca bieżące ustawienie ścieżki aplikacji
Metoda current zwraca ustawienie ścieżki aplikacji. Oto przykład:
- qDebug() << QDir::current();
Wynikiem działania będzie wyświetlenia ścieżki bezwzględnej do pliku programu
Metoda currentPath zwraca ustawienie ścieżki aplikacji. Oto przykład:
- qDebug() << QDir::currentPath();
Za pomocą metody setCurrent można zmienić ustawienie bieżącej ścieżki aplikacji.
Metoda zwracająca listę dostępnych napędów w systemie
Metoda drivers zwraca obiekt klasy QFileInfoList, który zawiera wszystkie nazwy zamontowanych w systemie napędów i partycji. Oto przykład:
- auto drives = QDir::drives();
- foreach(QFileInfo item, drives){
- qDebug() << item.absoluteFilePath();
- }
Wynik działania powyższego kodu:
"A:/" "C:/" "D:/"
Metoda zmieniająca styl zapisu ścieżki pod Windowsem na styl Linuxa
Metoda fromNativeSeparators zamienia przykładowo ścieżkę: "C:\\Folders\\Another one folder\\Some file.txt" na "C:/Folders/Another one folder/Some file.txt".
Metoda zwracająca ścieżkę do folderu użytkownika
Metoda home zwraca ścieżkę dostępu do folderu użytkownika w postaci obiektu klasy QDir. Możliwe jest też użycie metody homePath, która zwraca to samo pod postacią obiektu klasy QString.
Metody sprawdzające, czy ścieżka jest absolutna lub relatywna
Metoda isAbsolutePath sprawdza, czy podana ścieżka jest ścieżką absolutną, z kolei metoda isRelativePath sprawdza, czy podana ścieżka jest relatywna.
Metoda sprawdzająca, czy nazwa pliku pasuje do wzorca
Oto przykład użycia metody match w celu sprawdzenia, czy podana ścieżka spełnia warunki dopasowania:
- QString filter("*[0-9].jpg");
- QString fileName("File0100.jpg");
- qDebug() << QDir::match(filter, fileName);
- fileName = "File10d.jpg";
- qDebug() << QDir::match(filter, fileName);
Wynik działania powyższego kodu:
true false
Metody zwracające ścieżkę do partycji systemowej
Metoda root zwraca ścieżkę do partycji systemowej w postaci obiektu klasy QDir. Z kolei metoda rootPath zwraca tą ścieżkę jako obiekt klasy QString.
Pobieranie i ustawianie prefiksu do ścieżek systemowych
W Qt można utworzyć listę folderów podpiętych pod prefiks, który umożliwia wyszukiwanie podanego pliku, czy folderu w wielu lokalizacjach. Oto przykład użycia metod searchPaths oraz setSearchPaths:
- QDir dir = QDir::current();
- QString prefix = "images";
- QStringList paths = { "C:/images", "C:/textures", "C:/pictures" };
- QDir::setSearchPaths(prefix, paths);
- qDebug() << QDir::searchPaths(prefix);
Wynik działania powyższego kodu:
("C:/images", "C:/textures", "C:/pictures")
Metody zwracające ścieżkę do folderu tymczasowego (temporary)
Metoda temp zwraca obiekt klasy QDir zawierający ścieżkę do folderu zawierającego pliki tymczasowe. Z kolei metoda tempPath zwraca ścieżkę do tego samego folderu w postaci obiektu klasy QString.
Zamiana znaków stylu zapisu ścieżki Windowsa do formatu Linuxa
Metoda toNativeSeparators zamienia ścieżkę zapisaną w formacie: "C:\Some folder\some file.txt" do C:/Some folder/some file.txt".
Konstruktory klasy QDir
Klasa QDir dysponuje dwoma wartymi uwagi konstruktorami:
- QString path = "C:/";
- QDir dir1(path);
- QString nameFilter;
- QDir dir1(path, nameFilter, QDir::SortFlag::Unsorted, QDir::Filter::AllEntries);
Drugi konstruktor przyjmuje jako trzeci argument flagę sterującą sposobem sortowania plików i folderów przy ich wyszukiwaniu. Argument ten może przyjmować następujące wartości:
- QDir::Name(0x00) - sortowanie po nazwie;
- QDir::Time (0x01) - sortowanie po dacie modyfikacji pliku lub folderu;
- QDir::Size (0x02) - sortowanie po rozmiarze pliku;
- QDir::Type (0x80) - sortowanie po rozszerzeniu;
- QDir::Unsorted (0x03) - a zostaw nie posortowane;
- QDir::NoSort (-1) - nie sortuje;
- QDir::DirsFirst (0x04) - umieszcza najpierw posortowane (albo i nie) foldery a na końcu pliki;
- QDir::DirsLast (0x20) - umieszcza najpierw posortowane (albo i nie) pliki a na końcu foldery;
- QDir::Reversed (0x08) - odwraca kolejność sortowania;
- QDir::IgnoreCase (0x10) - ignoruje wielkość znaków podczas sortowania;
- QDir::LocaleAware (0x40) - sortowanie z wykorzystaniem aktualnych ustawień lokalnych (poprawnie obsługuje sortowanie nazw zawierających polskie znaki)
Czwarty argument tego konstruktora przyjmuje flagę sterującą sposobem filtrowania plików i folderów przy ich wyszukiwaniu. Argument ten może przyjmować następujące wartości:
- QDir::Dirs (0x001) - zwracana będzie lista folderów spełniających warunki filtrowania;
- QDir::AllDirs (0x400) - zwracana będzie lista wszystkich folderów bez uwzględniania filtrowania;
- QDir::Files (0x002) - lista plików;
- QDir::Drives (0x004) - lista napędów (nie działa pod Linuxem;
- QDir::NoSymLinks (0x008) - ignoruje dowiązania symboliczne (nie działa na systemach, które nie obsługują dowiązań symbolicznych);
- QDir::NoDotAndDotDot (0x1000) - nie dodaje folderów "." i ".." do listy;
- QDir::NoDot (0x2000) - nie dodaje folderu "." do listy;
- QDir::NoDotDot (0x4000) - nie dodaje folderu ".." do listy;
- QDir::AllEntries (Dirs | Files | Drives) - lista folderów, plików, napędów oraz symbolicznych dowiązań;
- QDir::Readable (0x010) - zwraca listę plików, które mają ustawiony dostęp do odczytu. Ta flaga musi być użyta razem z QDir::Dirs lub QDir::Files;
- QDir::Writable (0x020) - zwraca listę plików, które mają ustawiony dostęp do zapisu. Ta flaga musi być użyta razem z QDir::Dirs lub QDir::Files;
- QDir::Executable (0x040) - zwraca listę plików, które są plikami wykonywalnymi. Ta flaga musi być użyta razem z QDir::Dirs lub QDir::Files;
- QDir::Modified (0x080) - zwraca listę plików, które zostały zmodyfikowane (nie działa na Linuxie;
- QDir::Hidden (0x100) - dodaje do listy pliki ukryte;
- QDir::System (0x200) - dodaje do listy pliki systemowe;
- QDir::CaseSensitive (0x800) - ustawia filtrowanie z uwzględnieniem wielkości znaków
Zmiana ścieżki za pomocą metody cd i cdUp
Listing 9 - QDir dir = QDir::current();
- qDebug() << dir.cdUp();
- qDebug() << dir;
- qDebug() << dir.cd("C:/");
- qDebug() << dir;
Pobieranie liczby plików i folderów znajdujących się w danej lokalizacji
Listing 10 - QDir dir = QDir::current();
- qDebug() << dir.count();
Pobieranie nazwy folderu bieżącej lokalizacji
Listing 11 - QString path = "C:/some folder";
- QDir dir(path);
- qDebug() << dir.dirName();
- QDir dir = QDir::current();
- qDebug() << dir.cdUp();
- qDebug() << dir;
- qDebug() << dir.cd("C:/");
- qDebug() << dir;
- QDir dir = QDir::current();
- qDebug() << dir.count();
- QString path = "C:/some folder";
- QDir dir(path);
- qDebug() << dir.dirName();
Wyświetli:
"some folder"
Pozyskiwanie listy plików i folderów
Istnieją dwie metody, które umożliwiają pozyskiwanie listy plików i folderów znajdujących się w zapisanej w obiekcie klasy QDir ścieżce. Te metody to:
- entryInfoList - zwraca listę obiektów typu QFileInfo, przechowujących informacje o danym pliku lub folderze;
- entryList - zwraca listę obiektów typu QString, przechowujących informacje nazwę danego pliku lub folderu
- QString path = "C:/Graphics";
- QDir dir(path);
- QFileInfoList list = dir.entryInfoList();
- foreach(auto file, list){
- qDebug() << file.baseName() + "." + file.completeSuffix() << "size:" << file.size();
- }
Powyższy kod wyświetli wszystkie pliki i foldery posortowane i filtrowane według domyślnych ustawień. Ustawienia te można zmienić w następujący sposób:
- QString path = "C:/Graphics";
- QDir dir(path);
- QStringList filterList = { "*.jpg", "*.gif" };
- list = dir.entryInfoList(filterList, QDir::Files, QDir::Name);
- foreach(auto file, list){
- qDebug() << file.baseName() + "." + file.completeSuffix() << "size:" << file.size();
- }
Powyższy kod przefiltruje pliki tak, że na liście będą znajdowały się tylko pliki z rozszerzeniem .jpg i .gif, filtrowanie zostanie ograniczone tylko do plików, które będą sortowane po nazwie.
Można nieco uprościć wyszukiwanie, jeżeli potrzebna jest ci tylko nazwa plików lub folderów z rozszerzeniem:
- QString path = "C:/Graphics";
- QDir dir(path);
- QStringList filterList = { "*.jpg", "*.gif" };
- QStringList listFiles = dir.entryList(filterList, QDir::Files, QDir::Name);
- foreach(auto file, listFiles){
- qDebug() << file;
- }
Sprawdzanie, czy ścieżka lub plik istnieje
- QDir dir = QDir::current();
- qDebug() << dir.exists(); // zwróci prawdę
- QString fileName = "some file name";
- qDebug() << dir.exists(fileName); // prawdopodobnie zwróci fałsz, gdy plik nie istnieje
Tworzenie ścieżki do pliku
- QString path = "C:/Graphics";
- QString imageFileName = "image.jpg";
- QDir dir(path);
- qDebug() << dir.filePath(imageFileName); // łączy ścieżkę z nazwą pliku
Sprawdzanie właściwości przechowywanej ścieżki
- QString pathAbsolute = "C:/Graphics";
- QString pathRelative = "./Graphics";
- QDir absolute(pathAbsolute);
- QDir relative(pathRelative);
- // czy ścieżka jest relatywna
- qDebug() << absolute.isRelative();
- qDebug() << relative.isRelative();
- // czy ścieżka jest absolutna
- qDebug() << absolute.isAbsolute();
- qDebug() << relative.isAbsolute();
- // czy folder jest do odczytu
- qDebug() << absolute.isReadable();
- qDebug() << relative.isReadable();
- // czy lokalizacja jest partycją główną
- qDebug() << absolute.isRoot();
- qDebug() << relative.isRoot();
Zamiana ścieżki względnej na bezwzględną względem bieżącego ustawienia ścieżki programu
- QString path = "Debug";
- QDir dir(path);
- qDebug() << dir.makeAbsolute(); // wyświetli true, jeżeli ścieżka została zamieniona z powodzeniem
- qDebug() << dir.path();
Pobieranie ustawień filtrów i nazwanych filtrów oraz ich zmiana
Standardowo ustawione filtry wyszukiwania można zmienić za pomocą dwóch metod:
- setFilter - ustawia filtry opcji wyszukiwanych plików lub folderów;
- setNameFilters - ustawia wzorce filtrowania nazw plików
Oto przykład wykorzystania tych metod:
- QDir dir = QDir::current();
- dir.setFilter(QDir::Files); // ustawienie wyszukiwania tylko plików
- QStringList namedFilters = { "*.gif", "*.jpg" };
- dir.setNameFilters( namedFilters ); // ustawienie wyszukiwania plików z rozszeżeniem .gif lub .jpg
Z kolei metody zwracające to:
- filter - zwraca ustawienia filtrów;
- nameFilters - zwraca listę ustawionych nazwanych filtrów
Pobieranie ustawionej ścieżki i jej ustawianie
- QDir dir = QDir::current();
- QString path = "C:/";
- dir.setPath(path);
- qDebug() << dir.path();
Pobieranie i ustawianie flag sortowania
- QDir dir = QDir::current();
- dir.setSorting(QDir::Unsorted);
- qDebug() << ( dir.sorting() == QDir::Unsorted ? "Unsorted" : "Something else is set" );
Operacje na plikach i folderach
- mkdir - tworzy podkatalog w bieżącej lokalizacji, jeżeli katalog istnieje zwraca false;
- mkpath - tworzy całą ścieżkę podkatalogów, funkcja zwraca true nawet jeżeli ścieżka już istniała;
- rmdir - usuwa katalog o podanej nazwie (katalog musi być pusty, aby operacja się powiodła);
- rmpath - usuwa całą ścieżkę katalogów;
- remove - usuwa podany plik;
- rename - zmienia nazwę lub przenosi plik z jednego miejsca na inne
Porównywanie dwóch obiektów QDir
Klasa QDir obsługuje operatory porównania: == i !=.

Tytuł:
Architektura oprogramowania bez tajemnic. Wykorzystaj język C++ do tworzenia wydajnych aplikacji i systemów
Autor:
Adrian Ostrowski, Piotr Gaczkowski

Tytuł:
Opus magnum C++ 11. Programowanie w języku C++. Wydanie II poprawione (komplet)
Autor:
Jerzy Grębosz

Tytuł:
Programowanie wieloplatformowe z C++ i wxWidgets 3
Autor:
Bartosz W. Warzocha

Tytuł:
Język C++ i przetwarzanie współbieżne w akcji. Wydanie II
Autor:
Anthony Williams

Tytuł:
C++ dla bystrzaków. Wydanie VII
Autor:
Stephen R. Davis

Tytuł:
Tablice informatyczne. Podstawy C++
Autor:
Radosław Sokół

Tytuł:
Opus magnum C++11. Programowanie w języku C++ (komplet)
Autor:
Jerzy Grębosz

Tytuł:
OpenCV 3. Komputerowe rozpoznawanie obrazu w C++ przy użyciu biblioteki OpenCV
Autor:
Adrian Kaehler, Gary Bradski

Tytuł:
C++ w 24 godziny. Wydanie VI
Autor:
Rogers Cadenhead, Jesse Liberty

Tytuł:
C++ Optymalizacja kodu. Sprawdzone techniki zwiększania wydajności
Autor:
Guntheroth Kurt