Qt - sprawdzanie i przeszukiwanie ścieżek dostępu do plików i folderów za pomocą klasy QDir

Stronę tą wyświetlono już: 32 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:

Listing 1
  1. QString path = "C:/myFolders/icons";
  2. QString prefix = "icons";
  3. QDir::addSearchPath( prefix, path);
  4. QDir dir("icons:");
  5. 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:

Listing 2
  1. QDir dir = QDir::current();
  2. 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:

Listing 3
  1. 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:

Listing 4
  1. 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:

Listing 5
  1. auto drives = QDir::drives();
  2. foreach(QFileInfo item, drives){
  3. qDebug() << item.absoluteFilePath();
  4. }

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:

Listing 6
  1. QString filter("*[0-9].jpg");
  2. QString fileName("File0100.jpg");
  3. qDebug() << QDir::match(filter, fileName);
  4. fileName = "File10d.jpg";
  5. 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:

Listing 7
  1. QDir dir = QDir::current();
  2. QString prefix = "images";
  3. QStringList paths = { "C:/images", "C:/textures", "C:/pictures" };
  4. QDir::setSearchPaths(prefix, paths);
  5. 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:

Listing 8
  1. QString path = "C:/";
  2. QDir dir1(path);
  3. QString nameFilter;
  4. 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
  1. QDir dir = QDir::current();
  2. qDebug() << dir.cdUp();
  3. qDebug() << dir;
  4. qDebug() << dir.cd("C:/");
  5. qDebug() << dir;

Pobieranie liczby plików i folderów znajdujących się w danej lokalizacji

Listing 10
  1. QDir dir = QDir::current();
  2. qDebug() << dir.count();

Pobieranie nazwy folderu bieżącej lokalizacji

Listing 11
  1. QString path = "C:/some folder";
  2. QDir dir(path);
  3. 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
Listing 12
  1. QString path = "C:/Graphics";
  2. QDir dir(path);
  3. QFileInfoList list = dir.entryInfoList();
  4. foreach(auto file, list){
  5. qDebug() << file.baseName() + "." + file.completeSuffix() << "size:" << file.size();
  6. }

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:

Listing 13
  1. QString path = "C:/Graphics";
  2. QDir dir(path);
  3. QStringList filterList = { "*.jpg", "*.gif" };
  4. list = dir.entryInfoList(filterList, QDir::Files, QDir::Name);
  5. foreach(auto file, list){
  6. qDebug() << file.baseName() + "." + file.completeSuffix() << "size:" << file.size();
  7. }

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:

Listing 14
  1. QString path = "C:/Graphics";
  2. QDir dir(path);
  3. QStringList filterList = { "*.jpg", "*.gif" };
  4. QStringList listFiles = dir.entryList(filterList, QDir::Files, QDir::Name);
  5. foreach(auto file, listFiles){
  6. qDebug() << file;
  7. }

Sprawdzanie, czy ścieżka lub plik istnieje

Listing 15
  1. QDir dir = QDir::current();
  2. qDebug() << dir.exists(); // zwróci prawdę
  3. QString fileName = "some file name";
  4. qDebug() << dir.exists(fileName); // prawdopodobnie zwróci fałsz, gdy plik nie istnieje

Tworzenie ścieżki do pliku

Listing 16
  1. QString path = "C:/Graphics";
  2. QString imageFileName = "image.jpg";
  3. QDir dir(path);
  4. qDebug() << dir.filePath(imageFileName); // łączy ścieżkę z nazwą pliku

Sprawdzanie właściwości przechowywanej ścieżki

Listing 17
  1. QString pathAbsolute = "C:/Graphics";
  2. QString pathRelative = "./Graphics";
  3. QDir absolute(pathAbsolute);
  4. QDir relative(pathRelative);
  5. // czy ścieżka jest relatywna
  6. qDebug() << absolute.isRelative();
  7. qDebug() << relative.isRelative();
  8. // czy ścieżka jest absolutna
  9. qDebug() << absolute.isAbsolute();
  10. qDebug() << relative.isAbsolute();
  11. // czy folder jest do odczytu
  12. qDebug() << absolute.isReadable();
  13. qDebug() << relative.isReadable();
  14. // czy lokalizacja jest partycją główną
  15. qDebug() << absolute.isRoot();
  16. qDebug() << relative.isRoot();

Zamiana ścieżki względnej na bezwzględną względem bieżącego ustawienia ścieżki programu

Listing 18
  1. QString path = "Debug";
  2. QDir dir(path);
  3. qDebug() << dir.makeAbsolute(); // wyświetli true, jeżeli ścieżka została zamieniona z powodzeniem
  4. 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:

Listing 19
  1. QDir dir = QDir::current();
  2. dir.setFilter(QDir::Files); // ustawienie wyszukiwania tylko plików
  3. QStringList namedFilters = { "*.gif", "*.jpg" };
  4. 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

Listing 20
  1. QDir dir = QDir::current();
  2. QString path = "C:/";
  3. dir.setPath(path);
  4. qDebug() << dir.path();

Pobieranie i ustawianie flag sortowania

Listing 21
  1. QDir dir = QDir::current();
  2. dir.setSorting(QDir::Unsorted);
  3. 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 !=.

Strony powiązane
strony powiązane
  1. doc.qt.io/qt-4.8/qdir.html - opis klasy QDir w dokumentacji biblioteki Qt

Komentarze