【问题标题】:Move a file from a location to another in UNIX在 UNIX 中将文件从一个位置移动到另一个位置
【发布时间】:2016-01-11 13:58:15
【问题描述】:

我必须用一些命令在 unix 中实现一个 shell

我想像 mv -t 一样将多个文件移动到一个文件夹位置。

问题是重命名功能,只是重命名一个文件不要移动那个文件。

void mv_t()
{
  int mutat;
  char mvFile_name1[256];
  char mvFile_name2[256];
  int nr=0;

  printf("How many files you want to move: ");
  fflush(stdin);
  scanf("%d", &nr);

  printf("The file where you move: ");
  fflush(stdin);
  scanf("%s", &mvFile_name1);

  for(i=0; i<nr; i++)
  {
    printf("The file you want to move: ");
    fflush(stdin);
    scanf("%s", &mvFile_name2);

    mutat = rename(mvFile_name1, mvFile_name2);
    if(mutat != 0)
      perror("Error");
  }
}

这是我写的。 在“for”中,他取 mvFile_name1 并将其重命名为 mvFile_name2,然后他没有文件的先前名称。但如果这样可行,仍然不要移动 mvFile_name1 中的文件,他只需将它们重命名为 mvFile_name1。

【问题讨论】:

  • 这个fflush(stdin);是未定义的行为,它在windows上工作的原因并不重要,但在unix上它只是未定义的行为。这也是错误的scanf("%s", &amp;mvFile_name1);。 move 和 rename 有什么区别?您想以物理方式移动它们吗?
  • @iharob 它也适用于许多 Unices。并不意味着你应该使用它。
  • 您是否在 mvFile_name2 中指定了完整的目标路径(类似于“/path/to/new/file”)?
  • C 标准非常清楚 fflush 输入流:port70.net/~nsz/c/c11/n1570.html#7.21.5.2p2。无需关心为什么/是否有时会起作用。
  • 在 Unix 中没有 move,只有重命名,因为文件不是你想的那样:文件在一个平坦的空间中,它们的名称只是字符串(粗略)给他们并存储到目录内容中。所以moving只是重命名,改名字或者改名字的地方(但是文件不动)。

标签: c linux shell unix


【解决方案1】:

rename() 的参数顺序错误,请交换它们。

他们是:

rename(oldpath, newpath);

您还需要通过剥离任何路径来构造新路径 (在 / 之前的部分)在 mvFile_name2 中并将其替换为 mvFile_name1.

您还应该验证 mvFile_name1 是一个目录。

所以如果这个人进入:

1
/tmp
/some/place/this.txt

那么你应该这样做:

rename(/some/place/this.txt, /tmp/this.txt);

此外,如果旧路径和新路径位于不同的磁盘上,这将失败,但这可能比您想要处理的更复杂。

还有,@iharob 所说的一切。

【讨论】:

  • 由于这是一个初学者问题,除了手头的家庭作业之外,调用system( "mv...") 可能是解决跨磁盘移动问题的最快/最简单的解决方案。我猜因为他正在写一个shell,但这是不允许的。其他可能合理的选项是您自己的 fread/fwrite 循环或 sendfile(仅限 Linux)。
  • 我同意你的评价。
【解决方案2】:

即使你的代码有效,它也有一些问题

  1. fflush() 函数的行为在 c 标准中没有为 input 流定义,仅用于输出。因此,fflush(stdin) 是未定义的行为。

  2. 您必须检查scanf() 的返回值,否则可能会导致专门针对"%d" 说明符的问题。

  3. 这个scanf("%s", &amp;mvFile_name1); 是错误的,因为mvFile_name1 已经是指向数组第一个元素的指针。传递它的地址是错误的,因为结果指针的类型错误。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-13
    相关资源
    最近更新 更多