Lecture de la totalité du fichier à QString
Je suis en train de lire tous les fichiers dans un dossier, de les stocker dans fileList
via entryList()
puis, pour chaque fichier dans ce dossier, ouvrir et lire son contenu dans un QString
. Je pense que ce devrait être facile, mais je ne peux pas comprendre ce que je fais mal. L'erreur que je reçois maintenant dit:
no matching function for call to 'QTextStream::QTextStream(QFile*, QIODevice::OpenModeFlag)'
Je comprends que cela se rapporte à la mal je vais déclarer la QTextStream
, mais le truc, c'est que les exemples que j'ai trouvé semble NE ce, alors, pourquoi ne puis-je pas?
Aussi, j'ai remarqué que si j'ajoute le test pour vérifier si le fichier est ouvert a été un succès, je reçois un avertissement en disant: "accès refusé", même si je suis juste en train de lire. Bien, je peux lire le contenu du dossier et même remplir un QListWidget
avec ces fichiers sans problème.
Le fait que ce sont des *.Des fichiers JSON ne devrait pas d'importance, non?
J'ai vu cette, cette et cette exemples, mais ne peut pas comprendre ce que je fais mal. Toute aide est appréciée.
C'est mon code:
foreach(QString fileName, fileList){
QFile file(fileName);
file.open(QIODevice::ReadOnly);
QString s;
QTextStream s1(&file, QIODevice::ReadOnly);
s.append(s1.readAll());
qDebug() << "string content:" << s; //empty!!!
}
Mise à JOUR
Avec la modification suggérée par cmannett85, je n'ai plus l'erreur, mais pour une raison quelconque, la chaîne s
est encore vide à la fin.
Concernant les autorisations de lecture/écriture dans le dossier, j'ai remarqué que si je test
if(!file.open(QIODevice::ReadWrite))
{
QMessageBox::information(0,"error",file.errorString());
}
- Je obtenir deux avertissements - je suis soupçonner provoqué par .
et ..
- quand je lance la boucle. Avant qu'il produit 32 mises en garde et j'ai 30 les fichiers dans le dossier.
De toute façon, les fichiers que je suis en train de lire sont *.JSON et en fonction de la boîte de dialogue propriétés dans Windows 7, ils ne sont pas définies comme en lecture seule ou caché. Je peux écrire des fichiers dans le même dossier avec le même programme.
Il y a une chose que je me demande si cela pourrait être la raison pour cela: le nom de fichier contient .
avant l'extension, c'est à dire, ID.file.16.json
.
Mise à JOUR 2
Il n'est pas lié au nom de fichier ayant .
Testé avec des fichiers différents et le résultat est le même.
Aussi,les deux mises en garde étaient en effet liés à la .
et ..
. QDir::Filters
résolu le problème. Curieusement, cependant, dois-je appliquer le QDir::Files
filtre, tout est ok; mais si j'utilise le QDir::NoDotAndDotDot
de filtre, pas de fichiers sont détectés que ce soit, contrairement à l'intervalle Qt Assistant explication qui dit que seulement ces deux éléments sont ignorés à l'aide de ce filtre.
Mise à JOUR 3
Suivi ddriver de la suggestion, mais ne fonctionne toujours pas. Code actuel, y compris la recherche et l'extraction de fichiers dans le dossier est le suivant:
QDir assetsFolder = QDir("C:/Users/THB7OI/Desktop/app/qt-book/chap08/items");
QStringList files = assetsFolder.entryList(QDir::Files);
//for each file in the folder,
foreach (QString file, files) {
QFile f(file);
if (!f.open(QFile::ReadOnly | QFile::Text)) break;
QTextStream in(&f);
qDebug() << f.size() << in.readAll();
f.close();
}
- Avez-vous
#include <QTextStream>
? - yup...
- "accès refusé" sur un Open() n'est pas un avertissement, c'est une erreur. Dossier lire les autorisations sont différentes à partir d'un fichier d'autorisations de lecture. Si votre ouverture est vraiment défaut alors qu'allez vous arrêter là. E / s de fichier n'est pas un lieu d'ignorer les valeurs de retour.
- mais j'ai utilisé un autre programme que j'ai créé pour écrire les fichiers je vais maintenant essayer de lire dans le même dossier, est-il encore possible?
- Possible, oui. Normal, pas de. Quel OS & emplacement du dossier? Il y a quelques alambiqué autorisations de dossier qui pourrait vous permettre de créer et d'écrire mais pas lire. Sur certains partages réseau, par exemple.
- C'est un dossier local dans le bureau. Windows 7.
- stackoverflow.com/questions/15824043/...
- merci, mais je pense que le problème est ailleurs. La chaîne vient vides à la fin, et
file.size()
retourne 0... des idées? - voir ma réponse pour plus d'info.
Vous devez vous connecter pour publier un commentaire.
Comme l'a souligné, il n'existe pas de constructeur pour
QTextStream
.J'ai rapidement tapé ces quelques lignes pour vérifier qu'il est en effet à travailler correctement:
Et je ne reçois de la sortie attendue de la taille et du contenu de chaque fichier. Essayez ce code pour vérifier si vous avez fait une faute de frappe quoi que ce soit.
À ce point, je suis assez sûr que le problème est dans votre
fileList
- vous ne cochez pas siQFile::open()
réussit et continuer. Ironiquement, siopen()
échoue et votre code continue, vous obtiendrez exactement 0 pour la taille du fichier, et exactement une chaîne vide pour le résultat dereadAll()
. Donc, le problème réside avec les noms de vos fichiers. Et la prochaine fois, vérifiez siopen()
réussit - ne pas le faire est une très mauvaise pratique.Un autre candidat possible pour que vos fichiers ne s'ouvre est de savoir si ils sont ouvert en écriture par un autre processus. Redémarrez votre système et exécutez votre code directement assurez-vous que l'accès au fichier n'est pas verrouillé.
Si ça ne l'aide pas trop, sur la tête de l'intervalle Qt site du projet de poster le problème, et, si nécessaire, - un rapport de bogue.
0 ""
pour chaque fichier dans le dossier, cela n'a pas fonctionné aussi bien. Je l'ai fait immédiatement après, j'ai vu votre réponse après le démarrage de l'ordinateur. Je trouve ça vraiment bizarre que c'est un bug, c'est une jolie opération standard que je suis sûr que d'autres personnes l'ont fait avec succès...0 ""
signifie probablement que le code n'a pas trouver le fichier. Assurez-vous que le fichierfile
existe. Exemple: créer un fichier/tmp/test.txt
avec un texte, puis utilisezQFile f("/tmp/test.txt")
et cela devrait fonctionner. Si vous obtenez toujours0 ""
comme un résultat, cela signifie que le fichier est vide, ou quelque chose d'autre, il est impossible de lire le fichier. (J'ai juste eu le même résultat que toi, mais il a été causé par une faute de frappe dans le nom de fichier 🙂 espérons que cette aide!)Aucun des exemples que vous fournissez sont la création de
QTextStream
la façon dont vous êtes.QTextStream::QTextStream(QFile*, QIODevice::OpenModeFlag)
n'existe pas, utilisezQTextStream s1(&file)
, vous avez déjà mis le mode d'ouverture dans leQFile
.Juste parce que vous avez accès au dossier, ne signifie pas que vous pouvez lire le contenu du fichier. Si vous disposez d'un accès en lecture et ils sont de simples fichiers texte, vous devriez être en mesure de les ouvrir dans un éditeur de texte. Pouvez-vous?
QTextStream::QTextStream(File*, QIODevice::OpenModeFlag)
(à l'aide d'un simple vieuxFile
pointeur) ne existe et pourrait être la raison de la confusions
variable est toujours vide... des idées? Je peux non seulement d'ouvrir, de modifier et de les enregistrer dans un éditeur de texte, une autre partie de mon programme créer les fichiers que je vais maintenant essayer de lire...QIODevice::Text
ainsi queQIODevice::ReadOnly
lors de l'ouverture de laQFile
. Également essayer d'appelerfile.size()
pour voir si Qt pense qu'il y a des données qu'il.file.size()
retourne toujours 0. Pensez-vous que cela pourrait être lié à ce que j'ai posté que les éditer dans la question? J'ai essayé de changer le nom du fichier de sorte qu'il ne contient pas de.
et le problème est toujours là...QDir::Filter
pour afficher uniquement les fichiers et je n'ai plus les mises en garde au début - il vraiment lié à.
et..
. Ne peut toujours pas comprendre pourquoi lefile.size()
renvoie la valeur 0, si... Modifié leQDir::Filter
pour afficher uniquement les fichiers et je n'ai plus les mises en garde au début - il vraiment lié à.
et..
. Ne peut toujours pas comprendre pourquoi lefile.size()
retourne 0, mais... Aussi, si j'utilise le filtreQDir::Readable
les mêmes fichiers pop up...file.size()
?QTextStream
.file.close()
dans la boucle. Vous pensez que pourrait-il être? Je vais redémarrer et de revenir ici après le test.À partir de votre exemple ne fonctionnera pas, parce que vous obtenez la liste de tous les fichiers (nom de fichier) pas le fichier avec le chemin d'accès;
Bien après un très gros mal de tête, j'ai compris qu'un vraiment basique et simple d'erreur a été à l'origine de ce - le chemin de l'application.
Sur le dernier morceau de code que j'ai ajouté dans la section question, j'ai ajouté:
avant la
foreach
boucle et tout fonctionne maintenant.Bien que cela a fini comme la réponse définitive, obtenu par la contribution des personnes qui a répondu en premier, ce n'était pas la question d'origine, j'ai eu, et pour cette raison, I +1 les deux autres réponses j'ai car ils spécifiquement répondu à ce que j'ai demandé initialement.
Aussi, comme ddriver de répondre spécifiquement ciblé les
fileList
problème et m'a fait réfléchir sur le chemin de l'application, j'ai marqué comme réponse correcte.