C言語関係掲示板

過去ログ

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


No.1147

ディレクトリのコピー方法
投稿者---ゲール(2002/03/04 12:21:56)


C言語のプログラム記述で指定したディレクトリをファイル、ディレクトリを含めてすべて指定したディレクトリにコピーするにはどのようにしたらいいのでしょうか?
できれば、指定したディレクトリごと全てをコピーする方法と、指定したディレクトリの中身すべてをコピーする方法を教えていただけたらと思います。

お分かりになるかたがいらっしゃいましたら是非宜しくお願い致します。

No.1151

Re:ディレクトリのコピー方法
投稿者---B.Smith(2002/03/04 16:57:18)


こんにちは。

プログラムによりディレクトリのコピーを行う方法をご紹介します。ファイルやディレクトリを検索し、発見したらコピーする、ということを行っています。
コンパイラはLSI-C試食版を使っています。
#include <dos.h>
#include <stdio.h>
#include <stdlib.h>

/* SrcDir       ... コピー元ディレクトリ */
/* DestDir      ... コピー先ディレクトリ */
void    CopyFiles(char *SrcDir,char *DestDir)
{
    struct find_t   find;
    char            Search[256+1];
    char            CopyPath[256+1];

    /* 指定のディレクトリ内をすべて検索 */
    sprintf(Search,"%s\\*.*",SrcDir);

    /* 初回検索 */
    /* ファイルまたはディレクトリが存在しない場合は一つ上の階層に戻る */
    if (_dos_findfirst(
            Search,_A_NORMAL | _A_HIDDEN | _A_SYSTEM | _A_SUBDIR,&find))
        return;

    /* 現在の階層の内容を検索し終えるまで繰り返す */
    do{
        /* 発見したファイル名で現在のパス、コピー先のパスを作成 */
        sprintf(Search,"%s\\%s",SrcDir,find.name);
        sprintf(CopyPath,"%s\\%s",DestDir,find.name);

        /* ディレクトリ発見時の処理 */
        if (find.attrib & _A_SUBDIR){
            /* "."または".."ではない場合 */
            if (*find.name != '.'){
                mkdir(CopyPath);           /* コピー先にディレクトリを作成 */
                CopyFiles(Search,CopyPath);/* サブディレクトリ内の検索 */
            }
        }else{
            /* ファイル発見時の処理 */
            _copy(Search,CopyPath);    /* ファイルのコピー */
        }
    }while(!_dos_findnext(&find));
}

/* (ファイルのコピー)*/
static void     _copy(char *SrcName,char *DestName)
{
    FILE    *fpr,*fpw;
    char    Rec[10 * 1024];
    int     nRet;

    if (!(fpr = fopen(SrcName,"rb")))    return;
    if (!(fpw = fopen(DestName,"wb"))){
        fclose(fpr);   return;
    }

    while(1){
        nRet = fread(Rec,sizeof(char ),sizeof(Rec ),fpr);
        fwrite(Rec,sizeof(char ),nRet,fpw);
        if (nRet < sizeof(Rec ))
            break;
    }

    fclose(fpr);    fclose(fpw);
}

この処理は、指定のディレクトリの中身をコピーします。ファイルのコピーを行う関数は、LSI-C試食版で発見できなかったので作ってしまいました。このコピー関数は間に合わせなので、実用性はあまりありません。使う場合はご自分で調整してください(難しいことは一切していないので、説明は要らないと思います)。

ディレクトリは木構造ですから、全検索は単純なトラバーサルであることが分かります。検索中のディレクトリ内にサブディレクトリを発見したら、現在のパスにそのサブディレクトリ名を付加し、それを引数として再帰します。これを繰り返すことで、指定のディレクトリの配下にあるすべてのファイル・サブディレクトリを検索することができます。

参考にしてみてください。



No.1154

Re:ディレクトリのコピー方法
投稿者---ゲール(2002/03/04 18:56:45)


ありがとうございます。
とっても参考になりました。

ちなみにC言語の中で、UNIXのCPコマンド等を使ってディレクトリコピーしたりできるんですか?

もし、出来るならその方法も教えていただけたらと思います。

質問ばかりですいません。

宜しくお願い致します。






No.1162

Re:ディレクトリのコピー方法
投稿者---retrun(2002/03/05 11:31:07)


>ちなみにC言語の中で、UNIXのCPコマンド等を使ってディレクトリコピーしたりできるんですか?

%man system で調べてみましょう。



戻る


「初心者のためのポイント学習C言語」 Last modified:2002.05.14
Copyright(c) 2000-2002 TOMOJI All Rights Reserved