実現したいこと
マイドキュメント(Documents)フォルダ配下のフォルダとファイルを取得したいのですが、隠しフォルダ・隠しファイルまで取得されます。
前提
Visual Studio
Visual C++
MFCのアプリケーションを作成しています。
ツリーコントロールにマイドキュメント(Documents)フォルダ配下のフォルダとファイルを表示しようとしています。
マイドキュメント(Documents)フォルダ配下には
「My Music」「My Pictures」「My Videos」「desktop.ini」の隠しファイル・フォルダがあり、以下の設定で表示されるようになります。
エクスプローラのオプション>表示のタブ>
・隠しフォルダ・ファイルを表示するをチェックあり
・保護されたオペレーションシステムファイルを表示しないをチェックなし
発生している問題・エラーメッセージ
隠しフォルダ・隠しファイルである、「My Music」「My Pictures」「My Videos」「desktop.ini」も取得されてしまい、以下のエラーが発生します。
ハンドルされない例外が 0x76659132 (KernelBase.dll) で発生しました(MFCApplication2.exe 内): 0xC000041D: ユーザー コールバック中に未処理の例外が発生しました。。
隠しフォルダ・ファイルを削除・移動する方法以外で、隠しフォルダ・ファイルは取得しないようにする関数等ありましたら、ご教授いただきますと幸いです。
(追記)
ご指摘の通り、再帰呼び出しで落ちていることは確かです。
再帰呼び出しの第2引数が以下になったときにエラーで落ちます。
C:\Users\Public\Documents\My Music
「My Music」「My Pictures」「My Videos」は隠しフォルダであり、ショートカットのため、
これが原因かと推測しておりました…
取得は再帰的に行いたく、マイドキュメントの1階層下のフォルダ(隠しファイルを含まない)を指定したところ、
再帰的にフォルダもファイルも取得することができます。マイドキュメント配下だけうまくいきません。。
(追記2)
ジャンクションと言うのですね。ありがとうございます。
ジャンクションを他のフォルダ内に作成し実行してみたところ、std::filesystemではフォルダとして判別し、
エラーは出ませんでした。
エクスプローラ上で、マイドキュメントの「My Music」「My Pictures」「My Videos」のジャンクションをクリックしたところ、リンク先を開くことはできず反応なしでした。アイコンがグレーがかっています。選択できないことがエラーの原因だと思われます。
該当のソースコード
C++
1 2 // 呼び出し側 3 4 std::filesystem::path p =L"C:\\Users\\Public\\Documents\\"; 5 6 // ルートに設定 7 HTREEITEM hItem = m_tree.InsertItem(p.filename().c_str()); 8 9 recursive(hItem, p); 10 11void CXxxxDlg::recursive(const HTREEITEM &hItem, const std::filesystem::path &p) 12{ 13 for (const std::filesystem::directory_entry &i : std::filesystem::directory_iterator(p)) 14 { 15 if (i.is_directory()) 16 { 17 // フォルダー 18 HTREEITEM hNewItem = m_tree.InsertItem(i.path().filename().c_str(), hItem); 19 20 // 再帰呼び出し 21 recursive(hNewItem, i.path()); 22 } 23 else if (i.is_regular_file()) 24 { 25 // ファイル 26 m_tree.InsertItem(i.path().filename().c_str(), hItem); 27 } 28 } 29} 30
補足情報(FW/ツールのバージョンなど)
ソースコード参考サイト
https://hirokio.jp/programming/cpp-mfc-treeview/
回答2件
あなたの回答
tips
プレビュー