rmdir() - ディレクトリーの削除

標準

標準/拡張機能 C/C++ 依存項目

POSIX.1
XPG4
XPG4.2
Single UNIX Specification、バージョン 3

両方  

形式

#define_POSIX_SOURCE
#include <unistd.h>

int rmdir(const char *pathname);

機能説明

ディレクトリー pathname が空であれば、そのディレクトリーを除去します。pathname は、. (ドット) または .. (ドット・ドット) で終わっていてはいけません。

pathname によりシンボリック・リンクが参照 される場合には、シンボリック・リンクの内容により名前を 付けられたファイルまたはディレクトリーに、rmdir() が影響 することはありません。rmdir() は、ファイルまたはサブディレクトリーを依然として含むディレクトリー を除去しません。

XPG4.2 の特殊な動作: pathname がシンボリック・リンクを指している場合には、rmdir() は失敗し、errno に ENOTDIR が設定されます。

現在ディレクトリーをオープンしているプロセスがない場合には、rmdir() はディレクトリーそのものを削除します。ディレクトリーによって占められるスペースが、新規使用のために解放されます。ディレクトリーの除去時に、ディレクトリーがオープンされているプロセスが 1 つ以上ある場合には、ディレクトリーそのものは、最後のプロセスが ディレクトリーをクローズするまで除去されません。最後のリンクが取り除かれた後のディレクトリーのもとでは、たとえこのディレクトリーがまだオープンされていても、新規ファイルを作成することはできません。

rmdir() は、それがプロセスの作業ディレクトリーであっても、そのディレクトリーを削除します。

rmdir() が正常に実行されると、親ディレクトリーの変更内容および 修正回数が更新されます。

戻り値

正常に実行された場合、rmdir() は 0 を戻します。

正常に実行されなかった場合、rmdir() は -1 を戻して、errno を次のいずれかの値に設定します。
エラー・コード
説明
EACCES
プロセスに、pathname の一部のコンポーネントに対する 検索許可がなかったか、あるいは除去するディレクトリーを 含むディレクトリーに対する書き込み許可がありませんでした。
EBUSY
現在、システムまたはプロセスで 使用中のため、pathname を除去することはできません。
EINVAL
pathname の最後のコンポーネントに、. (ドット) または .. (ドット・ドット) が含まれています。
EIO
物理 I/O エラーが発生しました。
ELOOP
ループがシンボリック・リンクに存在しています。複数の POSIX_SYMLOOP (limits.h ヘッダー・ファイルで定義 される整数) シンボリック・リンクが pathname の 解決で検出されます。
ENAMETOOLONG
_POSIX_NO_TRUNC が有効ですが、pathnamePATH_MAX 文字より長いか、または pathname の一部のコンポーネントが NAME_MAX 文字より長くなっています。シンボリック・リンクの場合、シンボリック・リンクの代わりに使われる パス名のストリングの長さが PATH_MAX を超えています。PATH_MAX 値と NAME_MAX 値は 、pathconf() を使用して確認できます。
ENOENT
pathname が存在しないか、あるいは空ストリングです。
ENOTDIR
pathname 接頭部のコンポーネントの一部がディレクトリーではありません。
ENOTEMPTY
ディレクトリーに、依然ファイルまたはサブディレクトリーが含まれています。
EPERM または EACCES
S_ISVTX フラグは、除去するディレクトリーの親ディレクトリーに設定され、呼び出し元は、除去するディレクトリーの所有者ではなく、親ディレクトリーの所有者でもなく、適切な特権もありません。
EROFS
除去するディレクトリーが、読み取り専用ファイル・システムにあります。

CELEBR16
⁄* CELEBR16

   This example removes a directory.
 
 *⁄
#define _OPEN_SYS
#include <fcntl.h>
#include <sys⁄stat.h>
#include <sys⁄stat.h>
#include <unistd.h>
#undef _POSIX_SOURCE
#include <stdio.h>

main() {
  char new_dir[]="new_dir";
  char new_file[]="new_dir⁄new_file";
  int  fd;

  if (mkdir(new_dir, S_IRWXU|S_IRGRP|S_IXGRP) != 0)
    perror("mkdir() error");
  else if ((fd = creat(new_file, S_IWUSR)) < 0)
    perror("creat() error");
  else {
    close(fd);
    unlink(new_file);
  }

  if (rmdir(new_dir) != 0)
    perror("rmdir() error");
  else
    puts("removed!");
}

関連情報