将用户选择的文件移动到另一个目录

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.txtC:\Users\MyName.

可能是什么问题?我试图从 oldDirnewDir 变量中删除 " ",但随后出现另一个错误:

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;