2016-05-04 19 views
0

私は結果を得ることができる、成功したコピーファイルプログラムを作りたいと思います:./a.out 1.c examples3/16.cコピーしたファイルのための新しいディレクトリを作りました。私はそれをやろうと間違っているので、どうやってこれを行うことができますか?私は1.cファイルを1か所で正常にコピーできます。ファイルを既存のディレクトリにコピーできますが、ファイルを新しく作成したディレクトリにコピーできません。どのようにしてこの問題を解決できますか?私のコピーしたファイルの新しいディレクトリをCで作成します

コード:

#include <stdio.h> 
#include <stdlib.h> 
#include <sys/types.h> 
#include <sys/stat.h> 
#include <unistd.h> 
#include <fcntl.h> 

#define BUFFERSIZE  4096 
#define COPYMODE  0644 
int file_exist (char *filename) 
{ 
struct stat buffer; 
return (stat (filename, &buffer) == 0); 
} 

int main(int ac, char *av[]) 
{ 
int ch; //ch - character no.        
struct stat sb; 
char directory[120]; 
FILE *source, *target; 
/* from http://stackoverflow.com/questions/30215462/how-to-get-the-source-files-the-file-which-i-want-to-copy-and-the-copied-file/30217023#30217023 */ 
if (ac <= 2) { 
    printf("Enter source and destination file names\n"); 
    exit(EXIT_FAILURE); 
} 

if (strcmp(av[1], av[2]) ==0) 
{ 
    printf("the files are the same\n"); 
    exit(1); 
} 

if (file_exist (av[2])) 
{ 
    printf ("the destination file exists\n"); 
    exit(1); 
} 
//printf("which directory do you want to send your destination file?"); 
//scanf("%s", directory); 

char serv_name[1000]; 
mkdir("newdir/", S_IRWXU | S_IRWXG | S_IRWXO); 
snprintf(serv_name, sizeof(serv_name), "newdir/%s", av[2]); 
FILE* f = fopen(serv_name, "w"); 
if (f < 0) { 
    perror("CLIENT:\n"); 
    exit(1); 
} 

source = fopen(av[1], "r");//getting and opening source file 
if(source == NULL) { 
    printf("Press any key to exit...\n"); 
    exit(EXIT_FAILURE); 
} 

target = fopen(av[2], "w");//getting and opening destination file 

if(target == NULL) { 
    fclose(source); 
    printf("Press any key to exit...\n"); 
    exit(EXIT_FAILURE); 
} 

while((ch = fgetc(source)) != EOF) 
    fputc(ch, target); 

fclose(source); 
fclose(target); 
printf("File copied successfully.\n"); 
/* from http://stackoverflow.com/questions/30215462/how-to-get-the-source-files-the-file-which-i-want-to-copy-and-the-copied-file/30217023#30217023 */ 
if (stat(av[1], &sb) == -1) { 
    perror("stat"); 
    exit(1); //exit(EXIT_SUCCESS); 
    } 
    else 
    if (chmod(av[2], sb.st_mode & 07777))//http://stackoverflow.com/questions/18032574/how-can-i-copy-permissions-from-a-file-that-already-exists 
    { 
    perror("chmod"); 
    } 

    printf("Source File: %s, Inode number: %d, Mode: 0x%04X\n", av[1], (unsigned)sb.st_ino, (unsigned)sb.st_mode); 

    if (stat(av[2], &sb) == -1) { 
    perror("stat"); 
    exit(1); 
    } 

    char *str; 
    str = (char *) malloc(15); 
    strcpy(str, av[2]); 

    if (stat(av[2], &sb) == -1) {//http://stackoverflow.com/questions/7430248/creating-a-new-directory-in-c 
    mkdir(av[2], 0700); 
    } 
    printf("Destination File: %s, inode number: %d, Address = %u, Mode: 0x%04X\n", av[2], (unsigned)sb.st_ino, str, (unsigned)sb.st_mode); 

    free(str); 
    return 0; 
    } 
+1

デバッガの使用を検討しましたか?あるいは、基本的なprintfデバッギングもしていますか? –

+1

と 'mkdir'の戻り値のチェックはどうですか?何らかの理由でディレクトリを作成できなかった場合はどうなりますか? –

+0

'av [2]'と 'newdir/av [2]'を開くポイントは何ですか?あなたのプログラムは端末で何を印刷しますか? – purplepsycho

答えて

3

私は正常に私のコピーされたファイルの新しいディレクトリを作ることができます。 [...]しかし

問題は、ディレクトリの作成から来るかもしれない別の新しいディレクトリまたはにファイルをコピーすることに成功していない:

あなたはあなたがプログラムを呼び出す場合:./a.out foo bar

snprintf(serv_name, sizeof(serv_name), "newdir/%s", av[2]); 
FILE* f = fopen(serv_name, "w"); 
あなたはあなたがプログラムを呼び出す場合はOK

あなたのプログラムは、newdir/barを開こうとします./a.out foo /path/to/bar

snprintf(serv_name, sizeof(serv_name), "newdir/%s", av[2]); 
FILE* f = fopen(serv_name, "w"); 

あなたのプログラムは開こうとします:それは確かに失敗します。

だからあなたの問題は、から来ている:木のディレクトリが正しくない場合は、fを開くことができない

snprintf(serv_name, sizeof(serv_name), "newdir/%s", av[2]); 
FILE* f = fopen(serv_name, "w"); 
if (f < 0) { 
    perror("CLIENT:\n"); 
    exit(1); 
} 

+0

問題を教えてくれてありがとう。私は今それを修正した。 – user4728257