3

ここには、フォルダまたはファイルが存在するかどうかを判断するための非常に基本的なコンソールプログラムがあります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に切り替えて、GnuGCCでコンパイルしています。私はそれが簡単な修正だと確信しています-誰かが助けることができますか?

(明らかに私はこれに慣れていないので、私が省略した他の情報が必要な場合は私に知らせてください)。

アップデート

問題はベースディレクトリにありました。更新された動作中のプログラムは次のとおりです。

#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

4 に答える 4

5

電話をかける直前にstat、次のコードを挿入します。

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

(または同等の)現在のディレクトリを確認します。私はあなたがそれがあなたが思っているものではないことに気付くと思います。

または、現在のディレクトリがわかっているコマンドラインから実行可能ファイルを実行します。IDEは、予期しないディレクトリから実行可能ファイルを実行することがよくあります。

または、フルパス名を使用して、どのディレクトリにいるかが関係ないようにします。

価値があるのは、最初のコードセグメントが完全に機能することです(Ubuntu 10ではgcc)。

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.
于 2010-12-14T01:29:50.383 に答える
1

実行中のプログラムの現在のディレクトリが、期待どおりのものであると確信していますか?path絶対パス名に変更してみて、それが役立つかどうかを確認してください。

于 2010-12-14T01:26:35.340 に答える
1

プログラムを実行するときは、障害者を確認してください。この問題はコンパイラが原因ではありません。DevCppは、プログラムの作業ディレクトリを自動的に設定する場合があります。

于 2010-12-14T01:27:02.870 に答える
0

stat()以下をチェックすることで、失敗した理由(ちなみに、C ++ではなくC関数)を見つけることができますerrno

#include <cerrno>

...

if (stat(path,&status) != 0)
{
    std::cout << "stat() failed:" << std::strerror(errno) << endl;
}
于 2010-12-14T01:40:22.087 に答える