2010-12-14 90 views
3

J'ai un programme de console assez basique ici, pour déterminer si un dossier ou un fichier existe ou non à l'aide stat:C++ - stat(), accès() ne fonctionne pas dans gcc gnu

#include <iostream> 
#include <sys/stat.h> 

using namespace std; 

int main() { 
    char path[] = "myfolder/"; 
    struct stat status; 

    if(stat(path,&status)==0) { cout << "Folder found." << endl; } 
    else { cout << "Can't find folder." << endl; } //Doesn't exist 

    cin.get(); 
    return 0; 
} 

Je aussi essayé la version access:

#include <iostream> 
#include <io.h> 

using namespace std; 

int main() { 
    char path[] = "myfolder/"; 

    if(access(path,0)==0) { cout << "Folder found." << endl; } 
    else { cout << "Can't find folder." << endl; } //Doesn't exist 

    cin.get(); 
    return 0; 
} 

Aucun d'entre eux trouvent mon dossier (ce qui est là dans le même répertoire que le programme). Ceux-ci ont travaillé sur mon dernier compilateur (celui par défaut avec DevCpp). Je suis passé à CodeBlocks et je compile maintenant avec Gnu GCC, si cela peut vous aider. Je suis sûr que c'est une solution rapide - quelqu'un peut-il aider?

(Évidemment, je suis un noob à ce sujet, donc si vous avez besoin d'autres informations que j'ai omises s'il vous plaît faites le moi savoir).

MISE À JOUR

Le problème était avec le répertoire de base. La mise à jour, le programme de travail est la suivante:

#include <iostream> 
#include <sys/stat.h> 

using namespace std; 

int main() { 
    cout << "Current directory: " << system("cd") << endl; 

    char path[] = "./bin/Release/myfolder"; 
    struct stat status; 

    if(stat(path,&status)==0) { cout << "Directory found." << endl; } 
    else { cout << "Can't find directory." << endl; } //Doesn't exist 

    cin.get(); 
    return 0; 
} 

une mise à jour

Transforme qu'une barre oblique inverse sur le chemin est gros problème.

+0

Appel perror (NULL) après l'échec, il pourrait gi Vous avez une idée. Aussi, je pense que vous devez passer des drapeaux à access() au lieu de 0, mais je ne sais pas pourquoi stat échoue. – ergosys

+0

Cela a fonctionné quand j'ai compilé avec DevCpp:/alors je pense que la syntaxe est OK ... – Ben

+0

Remettant la balise C parce que, malgré l'utilisation d'iostream, le cœur de la question se rapporte plutôt à C. – paxdiablo

Répondre

5

Juste avant votre appel stat, insérez le code:

system("pwd"); // for UNIXy systems 
system("cd"); // for Windowsy systems 

(ou équivalent) pour vérifier votre répertoire en cours. Je pense que vous trouverez que ce n'est pas ce que vous pensez. Sinon, exécutez l'exécutable à partir de la ligne de commande où connaissez dans quel répertoire vous vous trouvez. Les IDE exécuteront fréquemment votre exécutable depuis un répertoire auquel vous ne vous attendez pas.

Ou, utilisez le nom de chemin complet de sorte que peu importe quel répertoire vous êtes dans

Pour ce que ça vaut, votre premier segment de code fonctionne parfaitement (gcc sous Ubuntu 10):.

pax$ ls my* 
ls: cannot access my*: No such file or directory 

pax$ ./qq 
Cannot find folder. 

pax$ mkdir myfolder 

pax$ ll -d my* 
drwxr-xr-x 2 pax pax 4096 2010-12-14 09:33 myfolder/ 

pax$ ./qq 
Folder found. 
+0

Exécution à partir de CMD travaillé. 'system (" pwd ")' n'a pas fait. Mais de toute façon, je suis à nouveau sur la bonne voie. Merci pour l'aide. – Ben

+0

@Steve, excuses pour cela, je ne savais pas que vous étiez en cours d'exécution sous Windows. Ajout de cette variante pour l'exhaustivité. – paxdiablo

+0

Il s'avère une autre chose qui a jeté cela était l'antislash arrière à la fin de mon chemin. – Ben

1

Etes-vous sûr que le répertoire actuel de votre programme en cours est ce que vous attendez de lui? Essayez de changer path en un chemin absolu pour voir si cela aide.

+0

+1 puisque vous étiez sur la bonne voie, mais PAX l'a cloué. Merci! – Ben

1

Vérifiez votre PWD lorsque vous exécutez votre programme. Ce problème n'est pas causé par le compilateur. Vous DevCpp peut définir un répertoire de travail pour votre programme automatiquement.

+0

+1 puisque vous étiez sur la bonne voie, mais PAX l'a cloué. Merci! – Ben

0

Vous pouvez savoir pourquoi stat() a échoué (ce qui est une fonction C, pas C++, par la voie), en vérifiant errno:

#include <cerrno> 

... 

if (stat(path,&status) != 0) 
{ 
    std::cout << "stat() failed:" << std::strerror(errno) << endl; 
} 
+0

En fait, mon titre et mes tags ont été édités pour changer C en C++:/ – Ben

+0

'stat()' n'est pas une fonction C non plus (comme dans, ce n'est pas défini par C99) mais, si c'était le cas, être un C++ aussi :-) Je pense que les balises ont été changées simplement à cause des trucs de type 'cout' mais la question est autant pour C que C++. – paxdiablo

+0

@paxdiablo, eh bien, c'est à partir de POSIX C API, donc c'est C dans mon livre :) –