如何使用C ++在Linux中移动文件

时间:2018-01-28 22:44:13

标签: c++ linux

如何使用Linux中的C ++程序将文件从一个位置移动到另一个位置? 我编写了一个程序来执行此操作并运行,但是当我尝试将文件移动到另一个目录时它不会移动文件,我从cout语句中收到错误消息。当我尝试重命名该文件时,将其移动到具有新名称的同一目录中。如何修复我的代码,以便将文件移动到另一个目录?

这是我写的代码:

#include <iostream>
#include <stdio.h>
using namespace std;

int main ()
{
  int result=1;
  char oldname[500];
  char newname[500];
  cout << "Enter the name of a file you want to move (include directory structure)";
  cin >> oldname;
  cout << "Enter the new location (include directory structure)";
  cin >> newname;

  result = rename( oldname , newname );
  if ( result == 0 )
    cout << "File successfully moved" << endl;
  else
    cout << "Error moving file" << endl;
  return 0;
}

修改 我在我的代码中添加了perror,显示的错误信息是“Error moving file:No such file or directory”,即使我尝试移动它的目录确实存在并且它具有创建和删除文件权限。

2 个答案:

答案 0 :(得分:2)

您的代码在大多数情况下都适用。但是你忽略了一些重要的事情,在这种情况下它会破裂:

  • 明显的事情,如权限,不存在的路径......
  • 500个或更多字符的路径。请勿对oldnamenewname
  • 使用静态分配的内存
  • rename()无法在文件系统之间移动,所以这样做(并包含iostream

    ifstream ifs(oldname, ios::in | ios::binary);
    ofstream ofs(newname, ios::out | ios::binary);
    ofs << ifs.rdbuf();
    remove(oldname);
    

    remove()之前,您的总磁盘空间会少一些。

    • 如果您在文件系统之间移动并不重要,因为只有newname文件系统上的可用空间会缩小,这是您可以使用的空闲空间,否则您将无法在此处移动文件< / LI>
    • 如果oldnamenewname位于同一个文件系统上并且您真的关心这种临时丢失,那么请检查您是否将使用相同的文件系统并最终使用rename()。< / LI>

答案 1 :(得分:1)

如何修复程序取决于移动(重命名)失败的原因。

可以使用errno找到失败的原因。

在这种情况下,有必要确保源文件存在。

对于需要考虑强有力地实现移动的所有事情,我建议研究mv命令的实现。