如何在C中获取源文件(我要复制的文件)和复制文件的信息 [英] how to get the source file's (the file which I want to copy) and the copied file's information in C

查看:26
本文介绍了如何在C中获取源文件(我要复制的文件)和复制文件的信息的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想获取源文件信息,当我想复制源文件然后获取目标文件信息,当源文件已经被复制时.代码的问题是我无法复制和获取源文件和目标文件信息.

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?

代码:

#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
");
 //  fgets(source_file, 20, stdin);
source_file = argv[20];
 source = fopen(source_file, "r");

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

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

  target = fopen(target_file, "w");

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

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

   printf("File copied successfully.
");

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

       if (argc != 2) {
           fprintf(stderr, "Usage: %s <pathname>
", 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
");            break;
       case S_IFCHR:  printf("character device
");        break;
       case S_IFDIR:  printf("directory
");               break;
       case S_IFIFO:  printf("FIFO/pipe
");               break;
       case S_IFLNK:  printf("symlink
");                 break;
       case S_IFREG:  printf("regular file
");            break;
       case S_IFSOCK: printf("socket
");                  break;
       default:       printf("unknown?
");                break;
       }

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


       exit(EXIT_SUCCESS);
}   

void oops(char *s1, char *s2)
{
fprintf(stderr,"Error: %s ", s1);
perror(s2);
exit(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
");
        exit(EXIT_FAILURE);
    }
    source = fopen(argv[1], "r");
    if( source == NULL ) {
        printf("Press any key to exit...
");
        exit(EXIT_FAILURE);
    }

    target = fopen(argv[2], "w");
    if( target == NULL ) {
        fclose(source);
        printf("Press any key to exit...
");
        exit(EXIT_FAILURE);
    }

    while( ( ch = fgetc(source) ) != EOF )
        fputc(ch, target);
    fclose(source);
    fclose(target);
    printf("File copied successfully.
");

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

    return 0;
}

程序输出:

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

这篇关于如何在C中获取源文件(我要复制的文件)和复制文件的信息的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆