Vérifier si un fichier existe dans le dossier Windows

L'auteur de ce sujet a trouvé une solution à son problème.
Auteur du sujet

Bonjour

je suis un (très) gros noob en C++ et je suis confronté à un problème qui me semble assez évident mais pour lequel je n'arrive pas à trouver de solution

j'essaie de faire un truc très simple :

1) vérifier dynamiquement si le fichier "logX.txt" existe dans le dossier C:\Windows 2) si non, le créer

donc rien qu'au niveau des 3 premières lignes j'ai déjà deux soucis :

1
2
3
TCHAR windir[MAX_PATH]; GetWindowsDirectory(windir, MAX_PATH);
string file = windir + "\\log3.txt";
if (FILE *file = fopen(file, "r")) {

1) concaténer la chaîne de caractères 2) convertir le string file en "const char *" (mais ça j'imagine que je peux utiliser .c_str() ?)

je suis habitué au dev C# donc ces questions ne se posent pas habituellement, et là j'avoue que je galère un peu.

si vous voyez des solutions n'hésitez pas à m'en faire part

merci :)

+0 -0

Salut :) ,

On va essayer de rester en C++ et non en C :p . Tu peux utiliser boost::filesystem.

Sinon, tu peux aussi tester l'existence d'un fichier avec std::ifstream:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
#include <fstream>
#include <iostream>

/* inline */ bool fileExist(std::string const& filepath)
{
    std::ifstream f{ filepath };
    return f;
}
int main()
{
    if(!fileExist("fichier_qui_n_existe_pas.txt"))
    {
        std::cerr << "fichier_qui_n_existe_pas.txt does not exist" << std::endl;
        /* On peut créer le fichier avec par exemple std::ofstream */
    }
    return EXIT_SUCCESS;
}

Sinon, si tu veux rester comme tu le fais dans ton code …

1) concaténer la chaîne de caractères

2) convertir le string file en "const char *" (mais ça j'imagine que je peux utiliser .c_str() ?)

1) Tu encapsules dans un std::string et tu concatènes, oui ;) .

2) Oui, .c_str() devrais fonctionner.

Édité par Ilearn32

+0 -0

Je pense que TCHAR est un typedef ou sur un wchar_t, ou un char. windir est un tableau C de TCHAR (convertible en TCHAR*). Mais tu ne peux pas utiliser l'opérateur '+' sur 2 chaines de caractères bruts. Tu peux l'encapsuler dans un std::string. Par exemple:

1
std::string file = std::string{ windir } + "\\log3.txt";

Mais si TCHAR est un wchar_t, alors tu devras faire un truc comme dans ce lien.

Note que les tableaux C, c'est un truc assez déprécié en C++ et que l'on référera largement un std::array ;) .

Édité par Ilearn32

+0 -0

Pour répondre à la question qu'est-ce qu'un TCHAR, c'est un typedef soit vers char, soit ver wchar_t, selon si la compilation est en unicode ou non.

Pour reprendre l'exemple en C++, ne te prends pas la tête inutilement non plus:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
#ifdef UNICODE
typedef tstring std::wstring;
typedef tifstream std::ifstream;
#else
typedef tstring std::string;
typedef tifstream std::wifstream;
#endif

...

TCHAR windir[MAXPATH+1] = {0};
GetWindowsDirectory(windir, MAXPATH);
tstring filename = tstring(windir) + TEXT("\\truc.txt");
// ... puis utiliser la fonction file_Exists déjà proposée ci-dessus, en adaptant les types utilisés (tifstream)

Comme ça, que l'option unicode soit activée ou non, le code compilera.

Tu peux aussi utiliser fopen/_wfopen si tu y tiens, mais bon, c'est quand même plus simple comme ça.

Si quelqu'un a quelque chose de plus propre qu'un #ifdef, je prends; mais je ne crois pas que ce soit possible. OU alors il faut couper les cheveux en quatre avec des templates et ça sera soit pas très concis, soit moche à écrire.

Un point à noter est la macro TEXT, qui renvoie soit un const char[n], soit un const wchar_t[n]`; définition dans winbase.h.

Ma plateforme avec 23 jeux de société classiques en 6 langues et 13000 joueurs: http://qcsalon.net/ | Apprenez à faire des sites web accessibles http://www.openweb.eu.org/

+0 -0

Je place ma réponse dans un bloc secret car c'est un peu hors-sujet, mais si tu cherches juste à effectuer la tâche que tu as cité, tu peux tout simplement utiliser un petit script ; ce sera beaucoup plus rapide que de pondre le code C++ associé.

Un petit exemple en Perl :

1
2
my $filename = 'C:\Windows\logX.txt';
open($filename, :w).close unless $filename.IO ~~ :e;

Ou tout simplement, sous Windows, tu peux utiliser un script batch, qui ressemblerait à ça :

1
if NOT EXIST 'C:\Windows\logX.txt' MKDIR 'C:\Windows\logX.txt'

Sur ce, bonne soirée ;)

+0 -0

Sinon un cast static devrait suffire je pense. (pour en savoir plus sur les cast en C++)

LudoBike

Je passe par là pour signaler que ce cours est vraiment pas terrible, et est d'ailleurs très critiqué en commentaires. Je le déconseille fortement.

mehdidou99

Je savais pas, désolé pour le lien foireux du coup (je devrait plus souvent lire les comments)

« La Nature est un livre écrit en langage mathématique », Galilée

+0 -0

C'est normal, tu ne pouvais pas savoir ;) C'est très bien de lire les commentaires, ça permet de connaître la qualité d'un cours (en général)

Plus on apprend, et, euh… Plus on apprend. | Coliru, parfait pour tester ses codes sources !

+0 -0
Vous devez être connecté pour pouvoir poster un message.
Connexion

Pas encore inscrit ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte