【问题标题】:C function to copy directory in UNIX: files fail to copy在 UNIX 中复制目录的 C 函数:文件复制失败
【发布时间】:2013-04-30 09:45:45
【问题描述】:

我正在尝试用 C 编写一个函数来将目录的内容复制到另一个目录。这是我目前所拥有的:

void *copydirectory(void *arg1, void *arg2) 
{
  int error;
  struct dirent *direntp;
  DIR *dirp_source, *dirp_destination;
  char *source, *destination;
  copy_t copy;
  char filename[MAXNAME];

  // Set directory arguments
  source = arg1;
  destination = arg2;
  fprintf(stderr, "Source directory is %s and destination directory is %s\n", source, destination);

  // Open directories
  if ((dirp_source = opendir(source)) == NULL)
  {
      fprintf(stderr, "Failed to open %s\n", source);
      return 1;
  }

  if ((dirp_destination = opendir(destination)) == NULL)
  {
      perror("Failed to open destination directory");
      return 1;
  }

  // Read files in directory
  while ((direntp = readdir(dirp_source)) != NULL)
  {
      copy.tid = pthread_self();
      fprintf(stderr, "now at line 64\n");

      // Copy source filename
      if (snprintf(filename, MAXNAME, direntp->d_name) == MAXNAME)
      {
      fprintf(stderr, "Input filename %s is too long", direntp->d_name);
      continue;
      } 

      fprintf(stderr, "now at line 73\n");

      fprintf(stderr, "%s\n", filename);
      // Open file for reading
      if ((copy.args[0] = open(filename, R_FLAGS)) == -1)
      {
      fprintf(stderr, "Failed to open source file %s: %s\n", filename, strerror(errno));
      continue;
      }

      // Create destination filename for writing
      if (snprintf(filename, MAXNAME, "%s", direntp->d_name) == MAXNAME)
      {
      fprintf(stderr, "Output filename %s is too long\n", direntp->d_name);
      continue;
      }

      fprintf(stderr, "%s\n", filename);  
      // Open file for writing
      if ((copy.args[1] = open(filename, W_FLAGS, W_PERMS)) == -1)
      {
      fprintf(stderr, "Failed to open destination file %s: %s\n", filename,      strerror(errno));
      continue;
      }

      if (error = pthread_create((&copy.tid), NULL, copyfilepass, copy.args))
      {
      fprintf(stderr, "Failed to create thread: %s\n", strerror(error));
      copy.tid = pthread_self();
      }
  }

  // Close directory
  while ((closedir(dirp_source) == -1) && (errno = EINTR));

  fprintf(stderr, "Successfully copied all files in directory \n");

}

现在,为了进行测试,我只是在名为 dir1 和 dir2 的文件夹中有 2 个目录。 dir1 包含 3 个文件:file1、file2、file3。 但是,当我编译并运行代码时,我会收到以下消息:

./
./
Failed to open destination file .: is a directory
Failed to open source file file2: No such file or directory
Failed to open source file file3: No such file or directory
../
../
Failed to open destination file .: is a directory
Failed to open source file file1: No such file or directory

任何人有什么错误的建议?

【问题讨论】:

    标签: c unix


    【解决方案1】:

    无法打开目标文件 .: 是一个目录

    您会看到这一点,因为您的源目录包含名为 "."".." 的链接,分别指向其自身及其父目录。您应该专门检查并避免这些条目。

    打开源文件file2失败:没有那个文件或目录

    您看到这个是因为您试图在进程的当前工作目录中打开一个名为 "file2" 的文件,但该文件不存在 - 您要查找的文件位于源目录中。您需要考虑到这一点来构建文件名:

    // Copy source filename
    if (snprintf(filename, MAXNAME, "%s/%s", source, direntp->d_name) == MAXNAME)
    

    【讨论】:

    • 所以我像你说的那样改变了 snprint 函数,但我仍然得到同样的错误。我不太确定添加“%s/%s”有什么作用
    • @zyxxwyz:direntp->d_name在源目录中的文件名。如果你只是将它传递给open() 函数,那么它不知道你想在源目录中打开文件——它会尝试在当前目录中打开它。相反,您需要构建路径 "<source dir>/<file>" 并将 that 传递给 open() 函数。
    • 呃,我一直在尝试,但我不知道该怎么做。我不太确定如何在 C 中使用路径。您可以给我更多提示吗?
    • @zyxxwyz:尝试在每次调用open() 之前打印出您尝试打开的filename
    • @zyxxwyz:我认为您需要使用您现在正在尝试的代码及其产生的输出来更新问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-08-21
    • 1970-01-01
    • 2018-01-10
    • 1970-01-01
    • 2017-09-25
    • 2015-05-02
    • 1970-01-01
    相关资源
    最近更新 更多