#include <filesystem>
#include <iostream>

namespace fs = std::filesystem;

void main() {

	try {
		fs::path folde_path(R"(c:\temp)");

		for (const fs::directory_entry entry : fs::recursive_directory_iterator(folde_path)) {
			if (fs::is_regular_file(entry.path())) {
				std::cout << "file  :" << entry.path() << std::endl;
			}
			else if (fs::is_directory(entry.path())) {
				std::cout << "folder:" << entry.path() << std::endl;
			}
		}
	}
	catch (const fs::filesystem_error& e) {
		std::cout << e.what() << std::endl;
	}
	catch (const std::exception& e) {
		std::cout << e.what() << std::endl;
	}

	return;
}
file  :"c:\\temp\\file_1.txt"
file  :"c:\\temp\\file_2.txt"
folder:"c:\\temp\\folder_1"
file  :"c:\\temp\\folder_1\\file_1.txt"
folder:"c:\\temp\\folder_1\\folder_1"
folder:"c:\\temp\\folder_1\\folder_1\\folder_1"
folder:"c:\\temp\\folder_1\\folder_2"
folder:"c:\\temp\\folder_2"
folder:"c:\\temp\\folder_3"

削除する場合、fs::romoveで特定のファイル、 fs::romove_allでフォルダ配下すべてを削除
ただ、ファイルが開けれていて削除できないような場合こんな感じになります

フォルダ構成は、以下のとおりでbbb.xlsxは開いています。
c/\temp\file\aaa.txt
c/\temp\file\bbb.xlsx
c/\temp\file\ccc.txt

bbb.xlsxを消すときに、エラーとなるのでそこで例外が発生します。
エラーメッセージは、削除のメソッドに指定したパスが表示されるだけなので、どのファイルでエラーが発生したのかわかりにくいです

remove_all: プロセスはファイルにアクセスできません。別のプロセスが使用中です。: "c:\temp"

そこで、一つずつファイル、フォルダを消していくとなると、階層の深い方から順に消していくので
ソートで入れ替え、消せるファイルはすべてけすことにすると


remove: プロセスはファイルにアクセスできません。別のプロセスが使用中です。: "c:\temp\file\~$bbb.xlsx"
remove: プロセスはファイルにアクセスできません。別のプロセスが使用中です。: "c:\temp\file\bbb.xlsx"
remove: ディレクトリが空ではありません。: "c:\temp\file"
投稿日時: 2024-10-06 08:25:06
更新日時: 2024-10-10 16:40:10

ファイルもフォルダも同じくexistsでチェック

#include <filesystem>
#include <iostream>

namespace fs = std::filesystem;

void main() {
	// ファイルパスの存在チェック
	fs::path file_path(R"(c:\temp\file_1.txt)");

	bool result_file_path = fs::exists(file_path);	
	if (result_file_path) {
		std::cout << "存在する" << std::endl;
	}
	else {
		std::cout << "存在しない" << std::endl;
	}


	// フォルダパスの存在チェック
	fs::path folder_path(R"(c:\temp\folder_1)");

	bool result_folder_path = fs::exists(folder_path);
	if (result_file_path) {
		std::cout << "存在する" << std::endl;
	}
	else {
		std::cout << "存在しない" << std::endl;
	}

	return;
}

例外を含めて記載するとこんな感じ。

#include <filesystem>
#include <iostream>

namespace fs = std::filesystem;

void main() {

	try {
		// ファイルパスの存在チェック
		fs::path file_path(R"(c:\temp\file_1.txt)");

		bool result_file_path = fs::exists(file_path);
		if (result_file_path) {
			std::cout << "存在する" << std::endl;
		}
		else {
			std::cout << "存在しない" << std::endl;
		}

		// 他いろんな処理...

	}
	catch (const fs::filesystem_error& e) {
		std::cout << e.what() << std::endl;
	}
	catch (const std::exception& e) {
		std::cout << e.what() << std::endl;
	}

	return;
}
投稿日時: 2024-10-06 07:47:06

パスの\をエスケープするのが手間なので C#でいうとこの @"c:\temp\file.txt" に該当する機能ってなんだろうと調べてみたら
生文字列リテラルという名称のものがあるのね。

R"(c:\temp\file.txt)"
かっこで、かこうまでがセット。

投稿日時: 2024-10-06 07:31:06

最近の投稿

タグ

アーカイブ

その他