1

私の宿題から:

バックアップ ファイルは、必要に応じてプログラムが作成する .mybackup という隠しディレクトリに保存されます。ディレクトリを作成するには、mkdir() 関数 (詳細はここをクリック) を使用しますが、(stat() を使用するか EEXIST をチェックして) ディレクトリが既に存在するかどうかを確認してください。ディレクトリが既に存在する場合は、上書きしないでください。

ディレクトリが既に存在する場合、mkdirは本質的に-1を返すと思いました。確かにどこかで読んだ。私はここで間違っていますか?

4

2 に答える 2

4

mkdirエラーに対して -1 を返します。したがって、エラーを区別する、つまり、ディレクトリが既に存在するかstatどうかを確認するには、関数を使用するかerrnoEEXISTaftermkdirが -1 を返すかどうかを確認する必要があります。

if(mkdir(".mybackup", S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH) == -1)
{
    if(errno == EEXIST)
    {
        // Directory already exists, do something
    }
}
于 2012-11-17T23:24:37.353 に答える
2

mkdir関数は多くの理由で失敗する可能性があります:

[EACCES] パス プレフィックスのコンポーネントで検索権限が拒否されているか、作成するディレクトリの親ディレクトリで書き込み権限が拒否されています。

[EEXIST] 指定されたファイルが存在します。

[ELOOP] パス引数の解決中に検出されたシンボリック リンクにループが存在します。

[EMLINK] 親ディレクトリのリンク数が {LINK_MAX} を超えます。

[ENAMETOOLONG] パス引数の長さが {PATH_MAX} を超えているか、パス名コンポーネントが {NAME_MAX} を超えています。

[ENOENT] path で指定されたパス プレフィックスのコンポーネントが既存のディレクトリを指定していないか、パスが空の文字列です。

[ENOSPC] ファイル システムには、新しいディレクトリの内容を保持するため、または新しいディレクトリの親ディレクトリを拡張するための十分なスペースがありません。

[ENOTDIR] パス プレフィックスのコンポーネントがディレクトリではありません。

[EROFS] 親ディレクトリは読み取り専用ファイル システムに存在します。mkdir() 関数は、次の場合に失敗することがあります。

[ELOOP] パス引数の解決中に {SYMLOOP_MAX} を超えるシンボリック リンクが検出されました。

[ENAMETOOLONG] パス引数の解決でシンボリック リンクに遭遇した結果、置換されたパス名文字列の長さが {PATH_MAX} を超えました。

関数が返された場合、-1を確認せずに特定のエラーを確認できないerrnoため、それが推奨されます。

于 2012-11-17T23:26:30.817 に答える