how to get the source file's (the file which I want to copy) and the copied file's information in C

不羁的心 提交于 2019-12-20 07:33:58

问题


I want to get the source file information, when I want to copy the source file and then get the destination file information, when the source file has already being copied. The problem with the code is that I can't copy and get the source and destination file information.

How could you be able to fix my code to copy a file and get source and destination information?

Code:

#define BUFFER 100 // ** increased - file path can get pretty long
#define BUFFERSIZE      4096
#define COPYMODE        0644

void oops(char *, char *);
int file_exist(char *filename)
{
 struct stat buffer;
 return (stat (filename, &buffer) == 0);
}

int main(int argc, char *argv[])
{
char ch, source_file[20], target_file[20];
FILE *source, *target;

 //  printf("Enter name of file to copy\n");
 //  fgets(source_file, 20, stdin);
source_file = argv[20];
 source = fopen(source_file, "r");

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

  printf("Enter name of target file\n");
  fgets(target_file, 20 , stdin);

  target = fopen(target_file, "w");

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

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

   printf("File copied successfully.\n");

   fclose(source);
   fclose(target);
       struct stat sb;

       if (argc != 2) {
           fprintf(stderr, "Usage: %s <pathname>\n", argv[0]);
           exit(EXIT_FAILURE);
       }

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

       printf("File type:                ");

       switch (sb.st_mode & S_IFMT) {
       case S_IFBLK:  printf("block device\n");            break;
       case S_IFCHR:  printf("character device\n");        break;
       case S_IFDIR:  printf("directory\n");               break;
       case S_IFIFO:  printf("FIFO/pipe\n");               break;
       case S_IFLNK:  printf("symlink\n");                 break;
       case S_IFREG:  printf("regular file\n");            break;
       case S_IFSOCK: printf("socket\n");                  break;
       default:       printf("unknown?\n");                break;
       }

       printf("I-node number:            %ld\n", (long) sb.st_ino);


       exit(EXIT_SUCCESS);
}   

void oops(char *s1, char *s2)
{
fprintf(stderr,"Error: %s ", s1);
perror(s2);
exit(1);
}

回答1:


I am unsure where your difficulty lies, apart from errors mentioned in comment. I've simplified your code, removing the bitfield masks as I don't have their definitions.

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

int main(int argc, char *argv[])
{
    int ch;                                 // <--- int not char
    struct stat sb;
    FILE *source, *target;

    if (argc < 3) {
        printf("Enter two args: source and destination file names\n");
        exit(EXIT_FAILURE);
    }
    source = fopen(argv[1], "r");
    if( source == NULL ) {
        printf("Press any key to exit...\n");
        exit(EXIT_FAILURE);
    }

    target = fopen(argv[2], "w");
    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");

    if (stat(argv[1], &sb) == -1) {
        perror("stat");
        exit(EXIT_SUCCESS);
    }
    printf("File %s type: 0x%04X Mode: 0x%04X\n", argv[1], (unsigned)sb.st_ino, (unsigned)sb.st_mode);

    if (stat(argv[2], &sb) == -1) {
        perror("stat");
        exit(EXIT_SUCCESS);
    }
    printf("File %s type: 0x%04X Mode: 0x%04X\n", argv[2], (unsigned)sb.st_ino, (unsigned)sb.st_mode);

    return 0;
}

Program output:

>test test.c test2.c
File copied successfully.
File test.c type: 0x0000 Mode: 0x81B6
File test2.c type: 0x0000 Mode: 0x81B6


来源:https://stackoverflow.com/questions/30215462/how-to-get-the-source-files-the-file-which-i-want-to-copy-and-the-copied-file

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!