Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

find and move files in C++

Tags:

c++

I'm new to C++ and I've just read <C++ Primer> 4ed. Now I want to implement a little program to help me manage some mp3 files in my computer.

I have a .txt file which includes all the names(part of the names actually) of the files which I want to move(not copy) to a new folder(in the same column). For example, "word" and "file" in the .txt and I want to move all the .mp3 files whose filename contain "word" or "file" to a new folder. Hope my discription is clear, Opps..

I know how to read the strings in .txt into a set<string> and traverse it, but I have no idea how to search and move a file in a folder. I just want to know what else should I learn so that I can implement this function. I read C++ Primer and still I can't do much thing, that's really sad...

like image 922
twoyoung Avatar asked Mar 05 '14 15:03

twoyoung


People also ask

How do I move a file from one directory to another in CMD?

To move a file or directory from one location to another, use the command mv. Common useful options for mv include: -i (interactive) — Prompts you if the file you have selected overwrites an existing file in the destination directory. -f (force) — Overrides the interactive mode and moves without prompting.

How do I move a file in Linux command line?

Use the mv command to move a file from one location to another. To move a file on a computer with a graphical interface, you open the folder where the file is currently located, and then open another window to the folder you want to move the file into.


2 Answers

To move a file in C++, you do not have to use external libraries like Boost.Filesystem, but you can use standard functionality.

There is the new filesystem API, which has a rename function:

#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;
}

The drawback is to compile it, you need a recent C++17 compiler. (I tested it on gcc 8.0.1, and I also needed to link against -lstdc++fs).

But what should work on any C++ compiler today, is the old C API, which also provides 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;
}

But note that in both cases, the rename will fail if the source and destination files are not on the same filesystem. Then you will see an error like this:

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

In that case, you can only make a copy and then remove the original file:

#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");
}

Or with the new 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;
}
like image 131
Philipp Claßen Avatar answered Oct 11 '22 15:10

Philipp Claßen


Use rename() function to move a file

#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;
}
like image 21
Akash das Avatar answered Oct 11 '22 15:10

Akash das