C ++ - stat (), access () не работает под GNU GCC - PullRequest
3 голосов
/ 14 декабря 2010

У меня есть довольно простая консольная программа, чтобы определить, существует папка или файл или нет, используя stat:

#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;
}

Я также попробовал 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;
}

Никто из них не находит мою папку (которая находится прямо в том же каталоге, что и программа). Они работали на моем последнем компиляторе (по умолчанию с DevCpp). Я перешел на CodeBlocks и сейчас компилирую с Gnu GCC, если это поможет. Я уверен, что это быстрое решение - может кто-нибудь помочь?

(Очевидно, я новичок в этом, поэтому, если вам нужна какая-то другая информация, которую я оставил, пожалуйста, дайте мне знать).

UPDATE

Проблема была с базовым каталогом. Обновленная рабочая программа выглядит следующим образом:

#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;
}

ДРУГОЕ ОБНОВЛЕНИЕ

Оказывается, что обратная косая черта на пути - большая проблема.

Ответы [ 4 ]

5 голосов
/ 14 декабря 2010

Прямо перед вашим stat звонком введите код:

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

(или эквивалент), чтобы проверить ваш текущий каталог. Я думаю, вы обнаружите, что это не то, что вы думаете.

В качестве альтернативы, запустите исполняемый файл из командной строки, где вы знаете , в каком каталоге вы находитесь. Среды IDE будут часто запускать ваш исполняемый файл из каталога, который вы можете не ожидать.

Или используйте полное имя пути, чтобы не имело значения, в каком каталоге вы находитесь.

Что бы это ни стоило, ваш первый сегмент кода работает отлично (gcc под 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.
1 голос
/ 14 декабря 2010

Проверьте ваш PWD при запуске вашей программы.Эта проблема не вызвана компилятором.Ваш DevCpp может установить рабочий каталог для вашей программы автоматически.

1 голос
/ 14 декабря 2010

Вы уверены, что текущий каталог вашей работающей программы соответствует ожидаемому? Попробуйте изменить path на абсолютный путь, чтобы посмотреть, поможет ли это.

0 голосов
/ 14 декабря 2010

Вы можете узнать, почему stat() не удалось (кстати, это функция C, а не C ++), проверив errno:

#include <cerrno>

...

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