先頭へ戻る

ファイルの名前を変更する | Programming Place Plus C言語編 逆引き

Programming Place Plus トップページ -- C言語編 -- 逆引き

先頭へ戻る

この章の概要

この章の概要です。

目的

すでに存在しているファイルの名前を変更したいとします。

方法①(rename関数を使う)

C言語の標準ライブラリには、ファイルの名前を変更する rename関数があるので、これを使えば簡単です。

#include <stdio.h>

/*
    ファイルの名前を変更する。

    oldName: 変更するファイルの名前
    newName: 変更後のファイルの名前
    戻り値:  成功したら 0以外、失敗したら 0
*/
int renameFile(const char* oldName, const char* newName)
{
    return !(rename(oldName, newName));
}

int main(void)
{
    if (renameFile("test.txt", "test2.txt")) {
        puts("名前を変更しました。");
    }
    else {
        puts("名前の変更に失敗しました。");
    }

    return 0;
}

実行結果:

名前を変更しました。

rename関数の第1引数に、変更したいファイルの名前を指定します。 第2引数が変更後の名前です。

rename関数は、名前の変更に成功すると 0 を、失敗すると 0以外を返します。 真の方が失敗であることに注意してください。

変更後の方の名前を持ったファイルがすでに存在していた場合、どういう結果になるかは処理系定義となっています。Windows (Visual Studio) では失敗となります。

確実に失敗としたければ、変更後の名前を持ったファイルの存在を事前に確認して、 存在していたら rename関数の実行自体を避けるようにします。 ファイルの存在を確認する方法は、「逆引き ファイルの存在を確認する」を参照してください。

#include <stdio.h>
#include <sys/stat.h>

/*
    ファイルの存在を確認する。

    path:   ファイルパス。
    戻り値: 存在したら 0以外、存在しなければ 0
*/
int existFile(const char* path)
{
    struct stat st;

    if (stat(path, &st) != 0) {
        return 0;
    }

    // ファイルかどうか
    // S_ISREG(st.st_mode); の方がシンプルだが、Visual Studio では使えない。
    return (st.st_mode & S_IFMT) == S_IFREG;
}

/*
    ファイルの名前を変更する。

    oldName: 変更するファイルの名前
    newName: 変更後のファイルの名前
    戻り値:  成功したら 0以外、失敗したら 0
*/
int renameFile(const char* oldName, const char* newName)
{
    // 変更後の名前をもったファイルがすでに存在していたら、失敗とする
    if (existFile(newName)) {
        return 0;
    }

    return !(rename(oldName, newName));
}

int main(void)
{
    if (renameFile("test.txt", "test2.txt")) {
        puts("名前を変更しました。");
    }
    else {
        puts("名前の変更に失敗しました。");
    }

    return 0;
}

実行結果:

名前の変更に失敗しました。


参考リンク


更新履歴

'2018/4/2 「VisualC++」という表現を「VisualStudio」に統一。

'2018/2/14 新規作成。



逆引きのトップページへ

C言語編のトップページへ

Programming Place Plus のトップページへ



はてなブックマーク に保存 Pocket に保存 Facebook でシェア
Twitter でツイート Twitter をフォロー LINE で送る
rss1.0 取得ボタン RSS 管理者情報 プライバシーポリシー