IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
logo
Sommaire > Le contenu de Qt4 > QtCore > Fichiers et repertoires
        Comment effacer un fichier ?
        Comment vérifier si un fichier existe ?
        Comment copier un fichier ?
        Comment récupérer le chemin des répertoires spéciaux ?
        Comment sélectionner un nom de fichier ou répertoire à partir d'une boite de dialogue ?
        Comment lister les fichiers d'un répertoire et de ses sous répertoires ?
        Comment écrire dans un fichier texte ?
        Comment lire dans un fichier texte ?
        Comment écrire et lire dans un fichier binaire ?
        Comment connaitre le chemin du répertoire courant ?
        Comment récupérer le chemin du répertoire de l'exécutable ?



Comment effacer un fichier ?
auteur : François Jaffré
Pour cela il faut utiliser les méthodes suivantes de QFile :

Première methode
//On réference l'objet file au fichier
QFile file("C:/existe.txt");
//Efface le fichier "existe.txt" et renvoie true ou false si l'operation à bien réussi
bool valid = file.remove();
Deuxième méthode
//Efface le fichier "existe.txt" et renvoie true ou false si l'operation à bien réussi
bool valid = QFile::remove("C:/existe.txt");
lien : en QFile::remove
lien : en static QFile::remove

Comment vérifier si un fichier existe ?
auteur : François Jaffré
Pour cela il faut utiliser les méthodes suivantes de QFile :

  • bool QFile::exists() const -> Permet de verifier si le fichier pointer par l'objet QFile existe.
  • static bool QFile::exists(const QString & fileName) -> Permet de vérifier si le fichier "fileName" existe.
Première méthode
//On réference l'objet file au fichier 
QFile file("C:/existe.txt");
//Si valid == true le fichier existe
bool valid = file.exists();
Deuxième méthode
//Si valid == true le fichier existe
bool valid  = QFile::exists("C:/existe.txt");
lien : en static QFile::exists
lien : en QFile::exists

Comment copier un fichier ?
auteur : François Jaffré
Pour cela QFile met à notre disposition les méthodes suivantes :

Remarque : Ces deux méthodes renvoient true si la copie s'est bien passée et renvoie false dans le cas contraire. Si le fichier spécifié "newName" existe déjà la copie sera annulée et la méthode renverra false.
Utilisation de la première méthode
//On réference l'objet file au fichier 
QFile file("C:/copie.txt");
//On copie le fichier copie.txt vers copieNext.txt
bool valid = file.copy("C:/copieNext.txt");
Utilisation de la deuxième méthode
//On copie le fichier copie.txt vers copieNext.txt
bool valid  = QFile::copy ("C:/copie.txt", "C:/copieNext.txt");
lien : en QFile::copy
lien : en QFile::copy static

Comment récupérer le chemin des répertoires spéciaux ?
auteur : François Jaffré
Qt à partir de sa version 4.4 permet avec la classe QDesktopServices de récupérer les différents chemins des répertoires spéciaux tels que Movies, Pictures, Temp, etc. C'est la méthode statique storageLocation() qui prend en argument une énumération de type StandardLocation qui permet d'effectuer cela.
Exemple :On souhaite récupérer le répertoire Pictures de l'utilisateur.
QString PicturesPath = QDesktopServices::storageLocation(QDesktopServices::PicturesLocation);
La liste de tous les répertoires pouvant être récupérés est ici et correspond à l'énumération StandardLocation.

Remarque : Si vous utilisez l'option QDesktopServices:: DataLocation il est impératif que vous ayez défini préalablement le nom de l'application et le nom de l'organisation à l'aide des méthodes setApplicationName() et setOrganizationDomain() de la classe QCoreApplication.

lien : en QCoreApplication
lien : en QDesktopServices::storageLocation

Comment sélectionner un nom de fichier ou répertoire à partir d'une boite de dialogue ?
auteur : François Jaffré
Qt permet à l'aide de la classe QFileDialog une utilisation très simple de ces différentes boites de dialogue à l'aide de méthodes static:

  • QString getOpenFileName() -> Permet la récupération du chemin d'un fichier existant selectionné par l'utilisateur
  • QStringList getOpenFileNames() -> Permet la récupération du chemin de plusieurs fichiers existants selectionnés par l'utilisateur
  • QString getSaveFileName () -> Permet la récupération du chemin d'un de fichier non existant dans le but d'être sauvegardé
  • QString getExistingDirectory() -> Permet la récupération d'un répertoire sélectionné par l'utilisateur
Remarque : toutes ses méthode fonctionnent sur le même principe :
Exemple

/*On souhaite sélectionner un fichier de type MP3 à l'aide d'une boite de dialogue avec les contraintes suivantes:
*-Elle doit avoir comme label "Open mp3 file"
*-Elle doit s'ouvrir à partir du répertoire C:
*-Elle doit pouvoir filtrer les fichiers ayant l'extension .mp3 et aussi permettre de voir les fichiers ayant n'importent quelle extension*/

//Ouverture de la boite de dialogue qui est modale
QString myOpenFile = QFileDialog::getOpenFileName(this, tr("Open mp3 file"),tr("C:\\"), tr("MP3 files (*.mp3);;All Files (*.*)"));
//On vérifie que l'utilisateur a bien sélectionné un fichier
//Si la chaine est vide c'est que l'utilisateur a cliqué sur annuler
if(myOpenFile.isEmpty())
{
    return;
}
//Un fichier à été sélectionné par l'utilisateur
else
{
    ...
}
lien : en QFileDIalog

Comment lister les fichiers d'un répertoire et de ses sous répertoires ?
auteur : François Jaffré
Qt fournit depuis sa version 4.3 la classe QDirIterator qui permet la navigation entre répertoires. Cette classe possède plusieurs surcharges du constructeur permettant de préciser le type de navigation que l'on souhaite entre les répertoires. La navigation dans les répertoires se fait surtout à l'aide de deux méthodes :

Récupération des fichiers mp3 et avi se trouvant dans un répertoire et ses sous-répertoires.
// On sélectionne le répertoire à partir duquel on va rechercher les fichiers avi et mp3.
QString selectDir = QFileDialog::getExistingDirectory
(
    this, 
    tr("Ouvrir un répertoire"),
    "",
    QFileDialog::ShowDirsOnly| QFileDialog::DontResolveSymlinks
);
 
// On remplit une QStringList avec chacun des filtres désirés ici "*.mp3" et "*.avi".
QStringList listFilter;
listFilter << "*.avi";
listFilter << "*.mp3";

// On déclare un QDirIterator dans lequel on indique que l'on souhaite parcourir un répertoire et ses sous-répertoires. 
// De plus, on spécifie le filtre qui nous permettra de récupérer uniquement les fichiers du type souhaité.
QDirIterator dirIterator(selectDir, listFilter ,QDir::Files | QDir::NoSymLinks, QDirIterator::Subdirectories);

// Variable qui contiendra tous les fichiers correspondants à notre recherche
QStringList fileList; 
// Tant qu'on n'est pas arrivé à la fin de l'arborescence...
while(dirIterator.hasNext()) 
{   
    // ...on va au prochain fichier correspondant à notre filtre
    fileList << dirIterator.next(); 
}
Note 1 : Si on préfère récupérer une liste de type QFileInfoList au lieu d'une QStringList il suffit d'utiliser la méthode QDirIterator::fileInfo ().
Note 2 : Si on souhaite lister uniquement les fichiers d'un répertoire et non ceux de ses sous-répertoires il est préférable d'utiliser la méthode entryInfoList() de la classe QDir.

lien : en QDirIterator
lien : en QDir::entryInfoList
lien : QFileInfo

Comment écrire dans un fichier texte ?
auteur : François Jaffré
L'écriture dans un fichier texte se fait comme pour la lecture à l'aide de la classe QTextStream. Celle-ci fourni l'operateur << qui possède énormément de surcharges pour l'écriture dans un fichier. De plus on peut spécifier le jeux de caractères utilisé pour l'écriture avec la méthode QTextStream::setCodec.

Exemple: On souhaite écrire le fichier suivant avec le jeu de caractères UTF-8 :
Bonjour,
Nous sommes le 3 avril 2009 
//Création d'un objet QFile
QFile file("Qt.txt");
//On ouvre notre fichier en lecture seul et on verifie l'ouverture
if (!file.open(QIODevice::WriteOnly | QIODevice::Text)) 
    return;
 
//Création d'un objet QTextStream à partir de notre objet QFile
QTextStream flux(&file);
//On choisie le codec correspondant au jeux de caractère que l'on souhaite ici UTF-8
flux.setCodec("UTF-8");
//Ecriture des différentes lignes dans le fichier 
flux << "Bonjour," << endl << "Nous sommes le " << 3 << " avril " << 2009 << endl;
lien : en QTextStream
lien : en Liste des jeux de caractère supportés

Comment lire dans un fichier texte ?
auteur : haraelendil
La classe QTextStream offre des fonctionnalités intéressantes:
QString fileName = "fichier.txt";
QFile fichier(fileName);
fichier.open(QIODevice::ReadOnly | QIODevice::Text);
QTextStream flux(&fichier);
On peut ensuite lire le fichier de plusieurs façons:
* Intégralement:
QString tout =flux.readAll();
* Ligne par ligne:
QString ligne;
while(!flux.atEnd())
{
    ligne = flux.readLine();
    //traitement de la ligne
}
* Mot par mot:
QString mot;
while(!stream.atEnd())
{
    stream >> mot;
    //traitement du mot
}
La classe QTextStream offre une moyen simple d'écrire ou de lire du texte, d'en extraire ou d'ajouter des lignes, des mots ou des nombres, un QTextStream pouvant fonctionner avec un QIODevice, une QString ou même un QByteArray. Les opérateurs surchargé << et >> permettent d'opérer sur un QTextStream de façon très simple.
Remarque : Cette classe prend en compte l'encodage du texte.

Mais on peut aussi lire intégralement le contenu d'un fichier sans passer par la classe QTextStream, mais cela nécessite de passer par la classe QByteArray:
QString fileName = "fichier.txt";
QFile fichier(fileName);
fichier.open(QIODevice::ReadOnly);
QByteArray data;
 
data = fichier.readAll();
QString ligne(data);
De même, on peut lire le fichier ligne par ligne:
QString fileName = "fichier.txt";
QFile fichier(fileName);
fichier.open(QIODevice::ReadOnly);
QByteArray data;
 
while(!fichier.atEnd())
{
    data = fichier.readLine();
    QString ligne(data);
    //traitement de la ligne
}
lien : en QFile
lien : en QTextStream

Comment écrire et lire dans un fichier binaire ?
auteur : François Jaffré
Qt permet facilement d'écrire ou de lire dans un fichier de type binaire. Ceci se fait à l'aide de la classe QFile pour l'ouverture et la fermeture du fichier et de la classe QDataStream pour l'écriture ou la lecture de celui-ci. L'intérêt d'utiliser la classe QDataStream est d'être indépendant de la machine au niveau de l'encodage des octets. Dans les faits cela veut dire qu'un fichier binaire étant écrit à l'aide de la classe QDataStream sous Windows par exemple peut être lu sans problème sous toutes les autres plateformes supportant Qt (Mac, Linux...).

Remarque : par défaut, QDataStream travaille en big-endian.
Ecriture d'un fichier binaire
//Utilisation d'un vecteur de qint32 et pas d'int pour préserver la portabilité 
QVector<qint32> vec;
 
//On remplie le vecteur
vec.push_back(1);
vec.push_back(2);
vec.push_back(3);
vec.push_back(4);
 
//Utilisation d'un type qint32 pour préserver la portabilité
qint32 value = 67;
 
//Initialisation de la QString qui sera enregistrée dans le fichier binaire
QString str = "Cette chaine sera sauvegardée dans un fichier binaire";
 
QFile file("MyFile.bin");
//Ouverture du fichier en lecture seul
if (!file.open(QIODevice::WriteOnly))
    return;
//Création de notre QDataStream à partir de notre fichier précédemment ouvert
QDataStream binStream(&file);
//On spécifie la version de l'encodage qui va être utilisé par notre objet QDataStream 
binStream.setVersion(QDataStream::Qt_4_4);
//On ecrit nos differents objet dans le fichier
binStream << str << value << vec;
//On ferme le fichier
file.close();
Lecture de ce même fichier binaire
//Utilisation des mêmes types utilisés lors de l'ecriture
QVector<qint32> vec;
qint32 value;
QString str;
 
QFile file("MyFile.bin");
//Ouverture du fichier en lecture seul
if (!file.open(QIODevice::ReadOnly))
    return;
//Création de notre QDataStream à partir de notre fichier précédemment ouvert
QDataStream binStream(&file);
/*On spécifie exactement le meme type d'encodage que celui utilisé lors de l'ecriture*/
binStream.setVersion(QDataStream::Qt_4_4);
//Lecture des differents objects contenus dans notre fichier binaire
binStream >> str >> value >> vec;
//Fermeture du fichier
file.close();
lien : en QFile
lien : en QDataStream

Comment connaitre le chemin du répertoire courant ?
auteur : François Jaffré
Qt fourni la classe QDir pour manipuler les répertoires. Cette classe permet entre autre de récupérer le chemin du répertoire courant de l'éxecution et de le modifier :

Récupération du répertoire courant
QString CurrentDir = QDir::currentPath();
Spécifier le répertoire courant.
QString CurrentDir = "C:/Users/Developpez/Downloads";
QDir::setCurrent(CurrentDir);
Remarque :Il est intéressant de préciser que le répertoire courant n'est pas forcement le même que le répertoire ou se trouve l'exécutable.

lien : en QDir

Comment récupérer le chemin du répertoire de l'exécutable ?
auteur : François Jaffré
Qt fourni avec la classe QCoreApplication des méthodes static permettant de récupérer facilement des informations comme le chemin du répertoire de l'exécutable.

On exécute une application depuis C:\Users\developpez\Documents\test.exe
/*Contient le chemin complet du répertoire de l'exécutable (C:\Users\developpez\Documents)*/
QString MyAppDirPath =  QCoreApplication::applicationDirPath();

/*Contient le chemin complet de l'exécutable (C:\Users\developpez\Documents\test.exe)*/
QString MyAppPath = QCoreApplication::applicationFilePath ();
lien : en QCoreApplication


Consultez les autres F.A.Q's


Valid XHTML 1.1!Valid CSS!

Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright © 2006 Developpez Developpez LLC. Tous droits réservés Developpez LLC. Aucune reproduction, même partielle, ne peut être faite de ce site ni de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.