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

Autor podstrony: Krzysztof Zajączkowski

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

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:

Zmiana ścieżki za pomocą metody cd i cdUp

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

QDir dir = QDir::current(); qDebug() << dir.count();

Pobieranie nazwy folderu bieżącej lokalizacji

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:

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:

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:

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

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
Propozycje książek