Vérifier si un fichier existe dans le dossier Windows

a marqué ce sujet comme résolu.

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 :)

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.

+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 ;) .

+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.

+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 ;)

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)

+0 -0
Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

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