C言語関係掲示板

過去ログ

No.612.UNIX上でディレクトリをコピーする方法

[戻る] [ホームページ]
No.5919

UNIX上でディレクトリをコピーする方法を
投稿者---太郎(2003/04/23 15:54:39)


こんにちは
UNIX上でディレクトリをコピーする方法を教えて下さい
過去ログ見たらこんなソースを見つけたのですが、

#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);
}

これだと、#include<dos.h>がUNIX上なので使えません。
どうしたらよいのでしょうか。

No.5922

Re:UNIX上でディレクトリをコピーする方法を
投稿者---かずま(2003/04/23 22:27:37)


#include <stdio.h>
#include <stdlib.h>

void CopyFiles(const char *srcDir, const char *dstDir)
{
    char buf[1024];

    sprintf(buf,
        "(cd %s; /usr/bin/tar cf - .) | (cd %s; /usr/bin/tar xf -)",
        srcDir, dstDir);
    system(buf);
}


No.5930

Re:UNIX上でディレクトリをコピーする方法を
投稿者---太郎(2003/04/24 09:12:24)


レスありがとうございます

でも、UNIXコマンドを使わないでやりたいのです。
説明が不足してすいませんでした


No.5948

Re:UNIX上でディレクトリをコピーする方法を
投稿者---かずま(2003/04/25 01:04:54)


エラーのチェックをあまりやっていませんが、こんな感じでしょうか。
#include <sys/types.h>
#include <sys/stat.h>
#include <dirent.h>
#include <unistd.h>
#include <fcntl.h>
#incluce <stdio.h>

static void copyFile(const char *src, const char *dst)
{
    int fd0, fd1, n;  char buf[4096];  struct stat st;

    fd0 = open(src, O_RDONLY);
    if (fd0 < 0  || fstat(fd0, &st) < 0) return;
    fd1 = open(dst, O_WRONLY | O_CREAT | O_TRUNC, st.st_mode & 0777);
    if (fd1 < 0) { close(fd0); return; }
    while ((n = read(fd0, buf, sizeof buf)) > 0)
        write(fd1, buf, n);
    close(fd1);
    close(fd0);
}

static void copyDir(char *src, char *dst)
{
    struct dirent *dp;
    struct stat st;
    int srcLen = strlen(src);
    int dstLen = strlen(dst);
    DIR *dirp = opendir(src);

    if (dirp == NULL) return;
    for (; dp = readdir(dirp); src[srcLen] = dst[dstLen] = '\0') {
        if (!strcmp(dp->d_name, ".")) continue;
        if (!strcmp(dp->d_name, "..")) continue;
        sprintf(src + srcLen, "/%s", dp->d_name);
        sprintf(dst + dstLen, "/%s", dp->d_name);
        if (stat(src, &st) < 0) continue;
        switch (st.st_mode & S_IFMT) {
        case S_IFREG:
            copyFile(src, dst);
            break;
        case S_IFDIR:
            mkdir(dst, st.st_mode & 0777);
            copyDir(src, dst);
            break;
        }
    }
    closedir(dirp);
}

void CopyFiles(const char *srcDir, const char *dstDir)
{
    char src[1024], dst[1024];

    strcpy(src, srcDir);
    strcpy(dst, dstDir);
    copyDir(src, dst);
}