【发布时间】:2021-06-07 13:50:24
【问题描述】:
我正在尝试制作一个程序,将用户指定的文件(如file.txt)移动到他也指定的目录。我尝试使用move()函数,但我还不太明白,所以我尝试使用rename()函数并使用this site的代码作为帮助。
我使用过rename() 函数并像这样移动了一个文件:
char oldDir[] = "C:\\Users\\MyName\\file.txt";
char newDir[] = "C:\\Users\\MyName\\New folder\\file.txt";
if (rename(oldDir, newDir) != 0)
perror("Error moving file");
else
cout << "File moved successfully";
如果我正确输入了目录,那效果很好。问题是我想告诉用户输入一个文件的目录以移动到另一个目录,所以我尝试了这个:
char oldDir[] = " ";
char newDir[] = " ";
cout << "Type file directory: "; cin >> oldDir;
cout << "Type file directory to move to: "; cin >> newDir;
if (rename(oldDir, newDir) != 0)
perror("Error moving file");
else
cout << "File moved successfully";
但是,当在控制台中输入 oldDir 路径时,例如:C:\\Users\\MyName\\file.txt,我总是得到错误:
移动文件时出错,没有这样的文件或目录
在我输入newDir 路径之前它就返回了。当然file.txt 在C:\Users\MyName。
可能是什么问题?我试图从oldDir 和newDir 变量中删除" ",但随后又出现另一个错误:
不完整的类型是不允许的
我做错了什么?
【问题讨论】:
-
char oldDir[] = " ";提供正好 2 个chars(空格和 0 终止符)的存储空间。如果有人键入多个字符,oldDir存储空间不足。 (newDir也一样。)我强烈建议改用std::string。 (您可以使用std::string::c_str()访问原始C 字符串以在rename()中使用它。) -
看看cplusplus.com/doc/tutorial/basic_io的“cin and strings”部分
-
记录一下:是什么让
char oldDir[]成为一个完整的类型是 使用" "进行初始化,因为编译器决定了数组必须变成多大才能存储" ".因此,删除初始化不起作用。当然,您可以在括号中提供确切的数字,但我仍然建议使用std::string而不是 Cchar数组。 -
@Scheff 所以我已经将变量
char oldDir和newDir更改为string oldDir和newDir然后在 if 语句中添加 .c_str() ,我已经运行了程序并在该 file.txt 的目录中键入,我有错误说 "File exists" 即使我想移动文件而不是创建或者该错误要我说什么。if (rename(oldDir.c_str(), newDir.c_str()) != 0) -
1.) 您的更改使程序运行。 2.)“文件存在”对我来说听起来像是操作系统的回应。所以,看看MS doc.: rename 这可能意味着什么。我假设您的错误是
EACCES: newname 指定的文件或目录已存在或无法创建(路径无效);或者 oldname 是一个目录,而 newname 指定了不同的路径。您确定您使用的新名称的路径尚未被占用(来自之前的测试)?