rename() - ファイルの名前変更

標準

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

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

両方  

形式

#include <stdio.h>

int rename(const char *oldname, const char *newname);

機能説明

ファイルの名前を、oldname によって示される名前から、newname によって示される名前に変更します。

oldname ポインターは、既存のファイル名を指している必要があります。newname ポインターは、既存のファイル名を指定する必要はありません。オープン・ファイルの名前変更はできません。エラーの場合には、ファイルの名前は変更されません。

rename() 関数は、メモリー・ファイルと DASD データ・セットの名前を変更します (テープなどの非 DASD データ・セットはサポートされません)。また、この関数は、PDS (および PDSE) の個々のメンバーも名前変更し、さらに、PDS をシミュレートするファイルも名前変更します。

POSIX C の特殊な動作: z/OS®UNIX サービス環境で作業中でない場合は、メモリー・ファイルをクローズしておく必要があります。

rename() に渡されたファイル名の解釈は、プログラム で、POSIX(ON) または POSIX(OFF) が実行中であるかどうか によって異なります

HFS ファイルを MVS™ データ・セット名に変更したり、MVS データ・セット を HFS ファイル名に名前変更したりすることはできません。

oldnamenewname は両方とも同じタイプ、すなわち、両方ともディレクトリーとするか、または両方ともファイルとする必要があります。

newname が既に存在している場合には、oldnamenewname に名前変更される前に、これは除去されます。したがって、newname が既存のディレクトリーの名前を指定する場合 には、それが空のディレクトリーである必要があります。

oldname 引数がシンボリック・リンクを示す場合には、このシンボリック・リンクは名前変更されます。newname 引数がシンボリック・リンクを示す 場合には、このリンクは除去され、oldnamenewname に名前変更されます。rename() は、シンボリック・リンクの内容により名前を指定されたファイル またはディレクトリーには影響しません。

後に続く rename() の場合、プロセスには、oldname を 含むディレクトリーおよび newname を含むディレクトリー での書き込み許可が必要です。oldname および newname がディレクトリー の場合には、rename() には、ディレクトリー自体での書き込み 許可も必要です。

oldnamenewname の両方とも同じ ファイルを参照する場合には、rename() は正常に戻り、その他 のアクションは実行されません。

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

戻り値

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

正常に実行されなかった場合、rename() はゼロ以外を戻して、errno を次のいずれかの 値に設定します。
エラー・コード
説明
EACCES
以下のいずれかの理由で、エラーが発生しました。
  • プロセスに、新旧パス名の一部のコンポーネントでの、検索許可がありませんでした。
  • プロセスに、名前変更するファイルの親ディレクトリーまたはディレクトリー での書き込み許可がありませんでした。
  • oldname または newname がディレクトリーでした。
  • プロセスに、oldname または newname での書き込み許可が ありませんでした。
EBUSY
oldname および newname は、ディレクトリーを指定しますが、それらのうちの 1 つは、ルートまたはマウント・ポイントとして使用中のため、名前変更できません。
EINVAL
以下のいずれかの理由で、エラーが発生しました。
  • oldname が、newname のパス名の接頭部の一部です。
  • oldname または newname は、. (dot) または .. (ドット・ドット) のどちらかを参照します。
EIO
物理 I/O エラーが発生しました。
EISDIR
newname はディレクトリーですが、oldname は ディレクトリーではありません。
ELOOP
ループがシンボリック・リンクに存在しています。このエラーは、oldname または newname の解析中に検出されたシンボリック・リンクの数が POSIX_SYMLOOP より大きい場合に発生します。
ENAMETOOLONG
_POSIX_NO_TRUNC が有効ですが、pathnamePATH_MAX 文字より長いか、または pathname の一部のコンポーネントが NAME_MAX 文字より長くなっています。シンボリック・リンクの場合、シンボリック・リンクの代わりに使われるパス名のストリングの長さが PATH_MAX を超えています。PATH_MAX 値と NAME_MAX 値は 、pathconf() を使用して確認できます。
ENOENT
oldname と名前の付いたファイルまたは ディレクトリーが見つからなかったか、あるいは、oldname または newname の どちらかが指定されていませんでした。
ENOSPC
newname を入れる予定のディレクトリーを拡張できません。
ENOTDIR
oldname のパス名接頭部のコンポーネント または newname がディレクトリーではないか、あるいは oldname が ディレクトリーで、newname がディレクトリーでは ないファイルです。
ENOTEMPTY
newname でディレクトリーが指定されますが、このディレクトリーが 空ではありません。
EPERM または EACCES
S_ISVTX フラグは、oldname により参照されるファイルを含むディレクトリーで設定され、呼び出し元は、ファイル所有者でもなく、ディレクトリー所有者でもなく、適切な特権も持っていません。あるいは、newname は、既存のファイルを参照し、S_ISVTX フラグは、このファイルを含むディレクトリーで設定され、呼び出し元は、ファイル所有者でもなく、ディレクトリー所有者でもなく、適切な特権も持っていません。
EROFS
名前変更に、読み取り専用ファイル・システムでの書き込みが必要になることが あります。
EXDEV
oldname および newname で、異なるファイル・システムの ファイルまたはディレクトリーが識別されます。z/OSUNIX サービスは、異なるファイル・システム間のリンクをサポートしません。

CELEBR13
⁄* CELEBR13                                      

   This example takes two file names as input and uses rename() to change       
   the file name from the first name to the second name.                        

 *⁄                                                                             
#include <stdio.h>                                                              
                                                                                
int main(int argc, char ** argv )                                               
{                                                                               
  if ( argc != 3 )                                                              
    printf( "Usage: %s old_fn new_fn¥n", argv[0] );
  else if ( rename( argv[1], argv[2] ) != 0 )                                   
    printf( "Could not rename file¥n" );
}                                                                               

関連情報