在C ++中查找和移动文件

时间:2014-03-05 15:13:24

标签: c++

我是C++的新手,我刚读过<C++ Primer> 4ed。现在我想实现一个小程序来帮助我管理计算机中的一些mp3文件。

我有一个.txt文件,其中包含我要移动(不复制)到新文件夹(在同一列中)的文件的所有名称(实际名称的一部分)。例如,.txt中的“word”和“file”,我想将文件名中包含“word”或“file”的所有.mp3文件移动到新文件夹中。希望我的描述清楚,Opps ..

我知道如何将.txt中的字符串读入set<string>并遍历它,但我不知道如何在文件夹中搜索和移动文件。我只想知道我还应该学习什么才能实现这个功能。我读了C++ Primer,但我做不了多少事,真的很难过......

4 个答案:

答案 0 :(得分:6)

要使用C ++移动文件,您不必使用Boost.Filesystem之类的外部库,但可以使用标准功能。

新的filesystem APIrename功能:

#include <iostream>
#include <filesystem>

int main() {
  try {
    std::filesystem::rename("from.txt", "to.txt");
  } catch (std::filesystem::filesystem_error& e) {
    std::cout << e.what() << '\n';
  }
  return 0;
}

缺点是编译它,你需要一个最新的C ++ 17编译器。 (我在gcc 8.0.1上测试过,我还需要链接-lstdc++fs)。

但是今天在任何C ++编译器上应该起作用的是旧的C API,它还提供rename (cstdio)

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cerrno>

int main() {
  if(std::rename("from.txt", "to.txt") < 0) {
    std::cout << strerror(errno) << '\n';
  }
  return 0;
}

但请注意,在这两种情况下,如果源文件系统和目标文件不在同一文件系统上,则重命名将失败。然后你会看到这样的错误:

filesystem error: cannot rename: Invalid cross-device link [from.txt] [/tmp/to.txt]

在这种情况下,您只能制作副本,然后删除原始文件:

#include <fstream>
#include <iostream>
#include <ios>
#include <cstdio>

int main() {
  std::ifstream in("from.txt", std::ios::in | std::ios::binary);
  std::ofstream out("to.txt", std::ios::out | std::ios::binary);
  out << in.rdbuf();
  std::remove("from.txt");
}

或使用新API:

#include <iostream>
#include <filesystem>

int main()
{
  try {
    std::filesystem::copy("from.txt", "to.txt");
    std::filesystem::remove("from.txt");
  } catch (std::filesystem::filesystem_error& e) {
    std::cout << e.what() << '\n';
  }
  return 0;
}

答案 1 :(得分:1)

仅使用std工作的唯一方法是使用std::ifstream完全读取文件,然后使用std::ofstream将其写入新位置。但是,这不会从磁盘中删除旧文件。所以基本上你创建了一个文件的副本。它也比实际行动慢得多。

最佳解决方案是使用特定于操作系统的API,例如win32,例如提供MoveFile()功能。 Poco提供了这种API的独立于平台的抽象。请参阅:http://www.appinf.com/docs/poco/Poco.File.html

答案 2 :(得分:1)

使用 rename()函数移动文件

#include <iostream>
#include <cstdio>

using namespace std;

int main()
{
	char oldname[] = "C:\\Users\\file_old.txt";
	char newname[] = "C:\\Users\\New Folder\\file_new.txt";
	
	/*	Deletes the file if exists */
	if (rename(oldname, newname) != 0)
		perror("Error moving file");
	else
		cout << "File moved successfully";
	
	return 0;
}

答案 3 :(得分:0)

在Windows下运行system调用批处理命令:

system("move *text*.mp3 new_folder/");
system("move *word*.mp3 new_folder/");

在Unix下与shell语法相同。