要在C++中移動文件,您不必使用外部庫,如Boost.Filesystem,但可以使用標準功能。
有新filesystem API,其中有一個rename功能:
#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;
}
C++並不適用於此任務。主要是因爲沒有標準的方式,所以你需要一個圖書館或者自己寫一切。這當然是可能的,但你可能更適合使用腳本解決方案。 – stefan
那麼標準的C++庫並沒有在這些任務中開發。沒有什麼可以支持os文件系統操作。不過,如果我決心讓[boost :: filesystem](http://www.boost.org/doc/libs/1_55_0/libs/filesystem/doc/reference.html#rename)堅持使用C++。但對於這樣的事情,我更喜歡python。 – luk32
我也會使用Boost.Filesystem,至少在出現寬C++ 14支持之前。 –