【C言語】ディレクトリ(フォルダ)をコピーする方法

この記事では、C言語を使用してディレクトリをコピーする方法と、コピー時の注意点について説明します。

ディレクトリのコピー方法を学び、ファイルの上書きやパーミッション・所有者情報の保持に注意しながら、安全にディレクトリをコピーすることができるようになります。

目次から探す

ディレクトリのコピー方法

ディレクトリをコピーする方法について説明します。

ディレクトリをコピーするには、以下の手順を実行します。

  1. コピー元のディレクトリとコピー先のディレクトリを指定します。
  2. コピー元のディレクトリ内のファイルやサブディレクトリを再帰的に取得します。
  3. 取得したファイルやサブディレクトリをコピー先のディレクトリに作成します。

以下に、ディレクトリをコピーするためのサンプルコードを示します。


#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <dirent.h>
#include <sys/stat.h>
void copyDirectory(const char* srcDir, const char* destDir) {
    DIR* dir;
    struct dirent* entry;
    struct stat statbuf;
    char srcPath[256];
    char destPath[256];
    // コピー元のディレクトリを開く
    dir = opendir(srcDir);
    if (dir == NULL) {
        printf("Failed to open source directory.\n");
        return;
    }
    // コピー先のディレクトリを作成
    mkdir(destDir, 0755);
    // コピー元のディレクトリ内のファイルやサブディレクトリを取得
    while ((entry = readdir(dir)) != NULL) {
        // "." と ".." はスキップする
        if (strcmp(entry->d_name, ".") == 0 || strcmp(entry->d_name, "..") == 0) {
            continue;
        }
        // コピー元のパスを作成
        snprintf(srcPath, sizeof(srcPath), "%s/%s", srcDir, entry->d_name);
        // ファイルやディレクトリの情報を取得
        if (lstat(srcPath, &statbuf) == -1) {
            printf("Failed to get file information.\n");
            continue;
        }
        // コピー先のパスを作成
        snprintf(destPath, sizeof(destPath), "%s/%s", destDir, entry->d_name);
        // ファイルの場合はコピーする
        if (S_ISREG(statbuf.st_mode)) {
            FILE* srcFile = fopen(srcPath, "rb");
            FILE* destFile = fopen(destPath, "wb");
            if (srcFile == NULL || destFile == NULL) {
                printf("Failed to open file.\n");
                continue;
            }
            char buffer[1024];
            size_t bytesRead;
            while ((bytesRead = fread(buffer, 1, sizeof(buffer), srcFile)) > 0) {
                fwrite(buffer, 1, bytesRead, destFile);
            }
            fclose(srcFile);
            fclose(destFile);
        }
        // ディレクトリの場合は再帰的にコピーする
        else if (S_ISDIR(statbuf.st_mode)) {
            copyDirectory(srcPath, destPath);
        }
    }
    closedir(dir);
}
int main() {
    const char* srcDir = "コピー元のディレクトリのパス";
    const char* destDir = "コピー先のディレクトリのパス";
    copyDirectory(srcDir, destDir);
    printf("ディレクトリのコピーが完了しました。\n");
    return 0;
}

上記のサンプルコードでは、copyDirectory関数を定義しています。

この関数は、指定されたコピー元のディレクトリを再帰的にコピーして、指定されたコピー先のディレクトリに作成します。

ディレクトリのコピー時の注意点

ディレクトリをコピーする際には、以下の注意点に留意する必要があります。

ファイルの上書きに注意する

コピー先のディレクトリに同名のファイルが存在する場合、デフォルトでは上書きされます。

上書きを避けるためには、コピー先のディレクトリ内のファイルの存在を事前に確認し、上書きしないようにする必要があります。

パーミッションや所有者情報の保持に注意する

ディレクトリをコピーする際には、コピー元のディレクトリのパーミッションや所有者情報も保持する必要があります。

これにより、コピー先のディレクトリでも同じパーミッションや所有者情報が維持されます。

ただし、一部のオペレーティングシステムでは、パーミッションや所有者情報の保持が制限されている場合があります。

そのため、特定のオペレーティングシステムに依存しないように注意する必要があります。

以上が、ディレクトリのコピー方法とコピー時の注意点についての説明です。

目次から探す