このページの解説は C99 をベースとしています。
以下は目次です。
すでに存在しているファイルの名前を変更したいとします。
C言語の標準ライブラリには、ファイルの名前を変更する rename関数があるので、これを使えば簡単です。
#include <stdio.h>
/*
    ファイルの名前を変更する。
    old_name: 変更するファイルの名前
    new_name: 変更後のファイルの名前
    戻り値:  成功したら 0以外、失敗したら 0
*/
int rename_file(const char* old_name, const char* new_name)
{
    return !(rename(old_name, new_name));
}
int main(void)
{
    if (rename_file("test.txt", "test2.txt")) {
        puts("名前を変更しました。");
    }
    else {
        puts("名前の変更に失敗しました。");
    }
}実行結果:
名前を変更しました。rename関数の第1引数に、変更したいファイルの名前を指定します。 第2引数が変更後の名前です。
rename関数は、名前の変更に成功すると 0 を、失敗すると 0以外を返します。 真の方が失敗であることに注意してください。
変更後の方の名前を持ったファイルがすでに存在していた場合、どういう結果になるかは処理系定義📘となっています。Windows (Visual Studio) では失敗となります。
確実に失敗としたければ、変更後の名前を持ったファイルの存在を事前に確認して、 存在していたら rename関数の実行自体を避けるようにします。 ファイルの存在を確認する方法は、「逆引き ファイルの存在を確認する」を参照してください。
#include <stdio.h>
#include <sys/stat.h>
/*
    ファイルの存在を確認する。
    path:   ファイルパス。
    戻り値: 存在したら 0以外、存在しなければ 0
*/
int exist_file(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;
}
/*
    ファイルの名前を変更する。
    old_name: 変更するファイルの名前
    new_name: 変更後のファイルの名前
    戻り値:  成功したら 0以外、失敗したら 0
*/
int rename_file(const char* old_name, const char* new_name)
{
    // 変更後の名前をもったファイルがすでに存在していたら、失敗とする
    if (exist_file(new_name)) {
        return 0;
    }
    return !(rename(old_name, new_name));
}
int main(void)
{
    if (rename_file("test.txt", "test2.txt")) {
        puts("名前を変更しました。");
    }
    else {
        puts("名前の変更に失敗しました。");
    }
}実行結果:
名前の変更に失敗しました。
return 0; を削除(C言語編全体でのコードの統一)
Programming Place Plus のトップページへ
| はてなブックマーク に保存 | Pocket に保存 | Facebook でシェア | 
| X で ポスト/フォロー | LINE で送る | noteで書く | 
|  RSS | 管理者情報 | プライバシーポリシー |