1

フォルダーが存在しない場合は作成する必要があるため、次を使用します。

bool mkdir_if_not_exist(const char *dir)
{
  bool ret = false;
  if (dir) {
     // first check if folder exists
     struct stat folder_info;
     if (stat(dir, &folder_info) != 0) {
    if (errno == ENOENT) { // create folder
        if (mkdir(dir, S_IRWXU | S_IXGRP | S_IRGRP | S_IROTH | S_IXOTH) ?!= 0) // 755
        perror("mkdir");
        else
        ret = true;
    } else
         perror("stat");
    } else
         ret = true; ?// dir exists
     }
     return ret;
 }

フォルダーは、プログラムの最初の実行中にのみ作成されます。その後は単なるチェックです。stat 呼び出しをスキップして mkdir を呼び出し、EEXIST に対して errno をチェックすることをお勧めします。それは本当の利益をもたらしますか?

4

3 に答える 3

1

さらに重要なことに、stat+mkdirアプローチでは競合状態があります。statmkdir別のプログラムの間で を実行できるためmkdir、.mkdirEEXIST

于 2011-06-11T04:38:28.703 に答える
1

少しだけメリットがあります。「 LBYL vs EAFP」または「跳躍する前に見てください」と「許可よりも許しを求める方が簡単」を調べてください。

わずかな利点は、stat()システム コールがディレクトリ名を解析して i ノード (この場合は欠落している i ノード) に到達し、その後mkdir()同じことを行う必要があることです。確かに、 が必要とするデータmkdir()は既にカーネル バッファー プールにありますが、指定されたパスを 1 回ではなく 2 回トラバーサルする必要があります。したがって、この場合、LBYL を使用するよりも EAFP を使用する方がわずかに効率的です。

しかし、それが平均的なプログラムで本当に測定可能な効果であるかどうかは、非常に議論の余地があります. あらゆる場所にディレクトリを作成するだけであれば、利点が見つかるかもしれません。しかし、プログラムの開始時に単一のディレクトリを作成した場合、それは間違いなく小さな効果であり、本質的に測定不可能です。

strcmp(dir, "/some/where/or/another") == 0but は存在​​するが、 (必然的に)"/some/where"どちらも存在しない場合に対処する必要があるかもしれません。現在のコードは、パスの途中にある欠落しているディレクトリを処理しません。報告する ENOENT を報告するだけです。見えるコードは、実際にディレクトリであることも確認しません。存在する場合、それはディレクトリであると想定するだけです。これらのバリエーションを適切に処理するのは、よりトリッキーです。"/some/where/or""/some/where/or/another"mkdir()dir

于 2011-06-11T04:29:41.857 に答える