将用户选择的文件移动到另一个目录
Move a file that user chooses to another directory
我正在尝试制作一个程序,将用户指定的文件(如 file.txt
)移动到他也指定的目录中。我尝试使用 move()
函数,但是我还不太了解它,所以我尝试使用 rename()
function and used 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
,我总是得到错误:
Error moving file no such file or directory
它 returns 在我什至可以输入 newDir
路径之前。当然 file.txt
在 C:\Users\MyName
.
可能是什么问题?我试图从 oldDir
和 newDir
变量中删除 " "
,但随后出现另一个错误:
incomplete type is not allowed
我做错了什么?
首先,在运行时在命令提示符下输入斜线时,不要将斜线加倍,如果您正在这样做的话。转义斜杠仅适用于代码中的 string literals,不适用于运行时数据。
也就是说,您没有分配足够的内存来保存用户的输入。当使用 " "
初始化时,您的 oldDir[]
和 newDir[]
数组的大小各只有 2 char
。当您删除 " "
时,编译器不再知道数组的大小,因为您没有告诉它使用哪个大小。
您需要更像这样处理数组:
char oldDir[MAX_PATH] = "";
char newDir[MAX_PATH] = "";
std::cout << "Type file directory: ";
cin.getline(oldDir, MAX_PATH); // paths can contain spaces!
std::cout << "Type file directory to move to: ";
cin.getline(newDir, MAX_PATH); // paths can contain spaces!
if (rename(oldDir, newDir) != 0)
perror("Error moving file");
else
std::cout << "File moved successfully" << std::endl;
但是,您确实应该使用 std::string
:
std::string oldDir, newDir;
std::cout << "Type file directory: ";
std::getline(cin, oldDir); // paths can contain spaces!
std::cout << "Type file directory to move to: ";
std::getline(cin, newDir); // paths can contain spaces!
if (rename(oldDir.c_str(), newDir.c_str()) != 0)
perror("Error moving file");
else
std::cout << "File moved successfully" << std::endl;
如果您使用的是 C++17 或更高版本,请考虑使用 std::filesystem::rename()
instead of ::rename()
:
#include <filesystem>
std::string oldDir, newDir;
std::cout << "Type file directory: ";
std::getline(cin, oldDir); // paths can contain spaces!
std::cout << "Type file directory to move to: ";
getline(cin, newDir); // paths can contain spaces!
std::error_code err;
std::filesystem::rename(oldDir, newDir, err);
if (err)
std::cerr << "Error moving file: " << err.message() << endl;
else
std::cout << "File moved successfully" << std::endl;
我正在尝试制作一个程序,将用户指定的文件(如 file.txt
)移动到他也指定的目录中。我尝试使用 move()
函数,但是我还不太了解它,所以我尝试使用 rename()
function and used 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
,我总是得到错误:
Error moving file no such file or directory
它 returns 在我什至可以输入 newDir
路径之前。当然 file.txt
在 C:\Users\MyName
.
可能是什么问题?我试图从 oldDir
和 newDir
变量中删除 " "
,但随后出现另一个错误:
incomplete type is not allowed
我做错了什么?
首先,在运行时在命令提示符下输入斜线时,不要将斜线加倍,如果您正在这样做的话。转义斜杠仅适用于代码中的 string literals,不适用于运行时数据。
也就是说,您没有分配足够的内存来保存用户的输入。当使用 " "
初始化时,您的 oldDir[]
和 newDir[]
数组的大小各只有 2 char
。当您删除 " "
时,编译器不再知道数组的大小,因为您没有告诉它使用哪个大小。
您需要更像这样处理数组:
char oldDir[MAX_PATH] = "";
char newDir[MAX_PATH] = "";
std::cout << "Type file directory: ";
cin.getline(oldDir, MAX_PATH); // paths can contain spaces!
std::cout << "Type file directory to move to: ";
cin.getline(newDir, MAX_PATH); // paths can contain spaces!
if (rename(oldDir, newDir) != 0)
perror("Error moving file");
else
std::cout << "File moved successfully" << std::endl;
但是,您确实应该使用 std::string
:
std::string oldDir, newDir;
std::cout << "Type file directory: ";
std::getline(cin, oldDir); // paths can contain spaces!
std::cout << "Type file directory to move to: ";
std::getline(cin, newDir); // paths can contain spaces!
if (rename(oldDir.c_str(), newDir.c_str()) != 0)
perror("Error moving file");
else
std::cout << "File moved successfully" << std::endl;
如果您使用的是 C++17 或更高版本,请考虑使用 std::filesystem::rename()
instead of ::rename()
:
#include <filesystem>
std::string oldDir, newDir;
std::cout << "Type file directory: ";
std::getline(cin, oldDir); // paths can contain spaces!
std::cout << "Type file directory to move to: ";
getline(cin, newDir); // paths can contain spaces!
std::error_code err;
std::filesystem::rename(oldDir, newDir, err);
if (err)
std::cerr << "Error moving file: " << err.message() << endl;
else
std::cout << "File moved successfully" << std::endl;