如何在Linux中使用C++; 如何在Linux中使用C++程序将文件从一个位置移动到另一个位置? 我已经编写了一个程序来实现这一点,它会运行,但是当我尝试将文件移动到其他目录时,它不会移动该文件,我会从cout语句中得到错误消息。当我尝试重命名文件时,将其移动到具有新名称的同一目录中,它会起作用。如何修复代码,使其能够将文件移动到另一个目录
以下是我编写的代码:如何在Linux中使用C++; 如何在Linux中使用C++程序将文件从一个位置移动到另一个位置? 我已经编写了一个程序来实现这一点,它会运行,但是当我尝试将文件移动到其他目录时,它不会移动该文件,我会从cout语句中得到错误消息。当我尝试重命名文件时,将其移动到具有新名称的同一目录中,它会起作用。如何修复代码,使其能够将文件移动到另一个目录,c++,linux,C++,Linux,以下是我编写的代码: #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)"; c
#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;
}
#包括
#包括
使用名称空间std;
int main()
{
int结果=1;
charoldname[500];
char newname[500];
cout>oldname;
cout>newname;
结果=重命名(旧名称、新名称);
如果(结果==0)
cout如何修复程序取决于移动(重命名)失败的原因
可以使用查找故障原因
在这种情况下,必须确保源文件存在
对于需要考虑的所有事项,以稳健地执行移动,我建议研究mv
命令的实现。如何修复程序取决于移动(重命名)失败的原因
可以使用查找故障原因
在这种情况下,必须确保源文件存在
对于所有需要考虑以稳健地执行移动的事项,我建议研究mv
命令的实现。您的代码在大多数情况下都可以工作。但您忽略了一些重要事项,在这种情况下,它将中断:
- 显而易见的事情,如权限,不存在的路径
- 500个字符或更多的路径。不要将静态分配内存用于
oldname
和newname
- 使用
rename()
无法在文件系统之间移动,因此请这样做(包括iostream
)
ifstream-ifs(oldname,ios::in | ios::binary);
ofs流(newname,ios::out | ios::binary);
ofs您的代码在大多数情况下都能正常工作。但是您忽略了一些重要的事情,在这种情况下,它会崩溃:
- 显而易见的事情,如权限,不存在的路径
- 500个字符或更多的路径。不要将静态分配内存用于
oldname
和newname
- 使用
rename()
无法在文件系统之间移动,因此请这样做(包括iostream
)
ifstream-ifs(oldname,ios::in | ios::binary);
ofs流(newname,ios::out | ios::binary);
无论你想做什么,首先用重命名
命令在终端上试一下。一旦你成功了,然后你可以用一个程序做同样的事情看看这些答案:这个答案可能会给你更多的洞察力。我不敢相信有人会问:你到底在oldname
中键入了什么?ls-l
对该字符串有何意义?与newname
相同。rename
函数不创建目录。因此,您最好在移动之前自己创建目录。无论您是否尝试这样做,请先在终端上使用rename
命令进行尝试。一旦您能够成功使用它,您可以尝试执行以下操作:程序也一样看看这些答案:答案可能会给你更多的洞察力。我不敢相信有人会问:你到底为oldname
键入了什么?ls-l
对这个字符串说了什么?对于newname
也一样。rename
函数不会创建目录。所以,你最好r在移动之前自己创建。perror的错误是“没有这样的文件或目录”。我尝试将其移动到的目录确实存在,并且我将权限设置为“创建和删除文件”,因此我不明白为什么会收到该错误消息。@softengstu您是如何验证该目录存在的?我尝试将其移动到我在主页中看到的Documents文件夹,但当我刚才运行shell脚本进行双重检查时,它似乎不存在t、 我还创建了一个目录,然后尝试将文件移动到我刚刚创建的目录,我收到了相同的错误消息。如果它似乎不存在,那么这显然就是您无法将文件移动到那里的原因。抱歉,我在shell脚本中犯了一个错误(最初没有包含完整的目录结构)-它确实存在。perror的错误是“没有这样的文件或目录”。我尝试将其移动到的目录确实存在,并且我将权限设置为“创建和删除文件”,因此我不明白为什么会收到该错误消息。@softengstu您是如何验证该目录存在的?我尝试将其移动到我在主页中看到的Documents文件夹,但当我刚才运行shell脚本进行双重检查时,它似乎不存在t、 我还创建了一个目录,然后尝试将文件移动到我刚刚创建的目录,我收到了相同的错误消息。如果它似乎不存在,那么这显然就是您无法将文件移动到那里的原因。抱歉,我在shell脚本中犯了一个错误(最初没有包含完整的目录结构)-它确实存在。您建议复制到其他fs无法保留move应保留的权限。这一点很好!atime、mtime、ctime、UID和GID也不会保留。使用fstat()可以避免(如果需要)所有这一切
在读取内容之前对原始文件进行修改。在写入之前,可以使用mknod
使用内存中的元数据,并且只在创建文件后才开始写入。但是,您的代码将变得非常长…输入和输出标志是冗余的。您建议的复制到其他fs的权限无法保留,无法移动到ld preserve。这一点很好!atime、mtime、ctime、UID和GID也没有被保留。如果需要,可以在读取内容之前对原始文件使用fstat()
。在写入之前,可以使用mknod
使用我提供的元数据
ifstream ifs(oldname, ios::in | ios::binary);
ofstream ofs(newname, ios::out | ios::binary);
ofs << ifs.rdbuf();
remove(oldname);