質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

1回答

2878閲覧

C++Builder XE3 でTSearchRecが使えない

yoshin

総合スコア39

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2016/07/19 02:57

###前提・実現したいこと
あるディレクトリ直下にあるディレクトリ名、およびファイル名を取得したいです。
調べた情報をもとにコードをかきましたが、エラーが発生してしまいます。

後述するエラーメッセージによると
TSearchRec、faDirectoryが定義されていないことはわかります。

TSearchRec、faDirectoryを定義するにはなにかをincludeする必要がるのでしょうか?
それとも、私の開発環境ですと使えないのでしょうか?

本当に素人の質問で申し訳ありませんが、ご回答いただけると助かります。

###発生している問題・エラーメッセージ

エラーメッセージ

[bcc32 エラー] xxxxx.cpp(7): E2451 未定義のシンボル TSearchRec [bcc32 エラー] xxxxx.cpp(9): E2451 未定義のシンボル faDirectory

###該当のソースコード

【xxxxx.cpp】 #include "xxxxx.h" using namespace std; void DestinationFolderOfJissekiDat::SetFolderFullPaths() { TSearchRec Sr; int Attributes = faDirectory; if (FindFirst("ルートフォルダのパス", Attributes, Sr) == 0) { do { if ((Sr.Attr & Attributes) == Sr.Attr) { FolderFullPaths.push_back(Sr.Name) //FolderFullPathsは自作クラスのメンバーです。vector<string> } } while (FindNext(Sr) == 0); FindClose(Sr); } }

###補足情報(言語/FW/ツール等のバージョンなど)
C++ Builder XE3

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

こんにちは。

C++Builderから離れて久しいので外しているかも知れませんが、C++BuilderのTDirectory::GetFilesでファイルの一覧を取得するをみると、#include <IOUtils.hpp>で良さそうですよ。

投稿2016/07/19 03:33

Chironian

総合スコア23272

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yoshin

2016/07/19 06:46

ご回答いただきありがとうございます。 教えていただいたものをインクルードしたのですが、解決しませんでした。 ちなみに、C++Builder XE3のライブラリからTSearchRecを調査して、 #include <SysUtils.hpp>も試したのすが、同様に解決できませんでした。 他に何か、思い当たるところがありましたら教えてください。 申し訳ありません。
yoshin

2016/07/19 07:07

ためしに一からプロジェクトを作り直して、コードを簡潔にして実行してみたところ、 違うエラーが発生してしまいました。 原因等なにかわかりますでしょうか? 【以下コード】 #include <tchar.h> #include <stdio.h> #include <SysUtils.hpp> int _tmain(int argc, _TCHAR* argv[]) { TSearchRec Sr; int Attributes = faAnyFile; if(FindFirst("C\\temp\\*.*",Attributes,Sr)==0){ FindClose(Sr); }    return 0; } 【エラーメッセージ】 [ilink32 エラー] Error: 未解決の外部シンボル '__fastcall System::Internal::Strhlpr::UnicodeFree(System::UnicodeString&)' が C:\PROGRAM FILES (X86)\EMBARCADERO\RAD STUDIO\10.0\LIB\WIN32\DEBUG\VCLE.LIB|ustring から参照されています [ilink32 エラー] Error: 未解決の外部シンボル '__fastcall System::Internal::Strhlpr::UnicodeFromPChar(System::UnicodeString&, char *, bool)' が C:\PROGRAM FILES (X86)\EMBARCADERO\RAD STUDIO\10.0\LIB\WIN32\DEBUG\VCLE.LIB|ustring から参照されています [ilink32 エラー] Error: 未解決の外部シンボル '__fastcall System::Sysutils::FindFirst(const System::UnicodeString, int, System::Sysutils::TSearchRec&)' が C:\USERS\ARITA.YO\DOCUMENTS\RAD STUDIO\PROJECTS\WIN32\DEBUG\FILE1.OBJ から参照されています [ilink32 エラー] Error: 未解決の外部シンボル '__fastcall System::Sysutils::FindClose(System::Sysutils::TSearchRec&)' が C:\USERS\ARITA.YO\DOCUMENTS\RAD STUDIO\PROJECTS\WIN32\DEBUG\FILE1.OBJ から参照されています [ilink32 エラー] Error: リンクを実行できません
episteme

2016/07/19 08:02

リンク時のエラーの多くは「ライブラリが足りてない」のが原因。
yoshin

2016/07/19 09:05

本当に素人の質問で申し訳ないのですが、 ライブラリを追加するにはどうしたらよいのでしょうか?
Chironian

2016/07/19 10:10

エラーを見る限り、下記ですね。 ①TSearchRec については、#include <SysUtils.hpp>で正解。 ②これを使うにはSysUtilsライブラリのリンクが必要。 問題はSysUtilsライブラリのリンクの指定方法ですね。 ざっと検索してみましたが、全く情報がありません。embarcaderoのページでさえです。 ↓はSysUitlsを使ってますが、リンク指定について述べられてません。 http://docwiki.embarcadero.com/Libraries/Berlin/ja/System.SysUtils.FileAge (どのバージョンの情報が不明) また、大昔の記憶では、特にリンク指定が必要だった記憶がありません。 もしかして、XE3はSysUtilsをサポートしていないということはないでしょうか?
yoshin

2016/07/19 11:38

回答ありがとうございます。 やはりXE3ではサポート外なのかもしれませんねぇ。。。 古い環境なので情報もすくなく、調べる術がわかりません。。。
Chironian

2016/07/19 12:12

上記のembarcaderoのサイトでは、#include <System.SysUtils.hpp>となってました。 試しにやってみてはどうでしょうか? XE3は2012年発売ですので、それほど古くはないですよ。 XE8とかでているのでえらく古いように感じますけどね。 http://www.gesource.jp/weblog/?p=4261 ↑を見ると、SysUtilsはvclに含まれていそうです。 もし、そうなら改めてリンクする必要はない筈なのですよ。 インクルード・ファイルをミスして、想定外の関数へリンクしてしまったとか?
episteme

2016/07/19 12:18

いやいや、コンソールアプリケーションで試してるからVCLがリンクされない可能性も否定できない。
yoshin

2016/07/19 12:33

お二人共とてもご親切に回答いただきありがとうございます。 職場でないと環境がないので、明日教えていただいページを参考にしてチャレンジしてみます。
yoshin

2016/07/20 08:50

回答遅くなりまして申し訳ありません。 ・まずはVCLアプリケーションを作成し、TSearchRecをコードに記述後コンパイルが通るか確認しました。 ⇒問題なくコンパイルが通りました。⇒XE3でもTSearchRecはサポートされていそうです。 ・教えていただいたサイトの情報より、コンソールアプリケーションの実行時パッケージにvclを含められるか試してみました。 ⇒手順は下記のサイトです。  新しいパッケージの名前として "vcl" を入力して[追加]をしてみましたが、  実行時パッケージに追加することができませんでした。 http://docwiki.embarcadero.com/RADStudio/Seattle/ja/%E3%82%A2%E3%83%97%E3%83%AA%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%81%A7%E3%81%AE%E3%83%91%E3%83%83%E3%82%B1%E3%83%BC%E3%82%B8%E3%81%AE%E8%AA%AD%E3%81%BF%E8%BE%BC%E3%81%BF 教えていただいた下記のサイトに以下の記述があり、 "特定の実行時パッケージは、特定のプラットフォームだけで利用できることに注意してください。" もしかしたら、コンソールアプリでは、vclを実行時パッケージに含むことができないのかなとも考えています。 http://docwiki.embarcadero.com/RADStudio/Seattle/ja/%E3%81%A9%E3%81%AE%E5%AE%9F%E8%A1%8C%E6%99%82%E3%83%91%E3%83%83%E3%82%B1%E3%83%BC%E3%82%B8%E3%82%92%E4%BD%BF%E7%94%A8%E3%81%99%E3%82%8B%E3%81%8B%E3%81%AE%E6%B1%BA%E5%AE%9A
Chironian

2016/07/20 09:17

この場合のプラットフォームは、OSのことですのでプラットフォームの問題ではないだろうと思います。 しかし、VCLアプリケーションと言う表現になっているということは、非VCLアプリケーションにVCLを組み込めないのは自然ですね。 ところで、RTLを組込んでみてはどうでしょう? > rtl(実行時ライブラリ)パッケージには、コンポーネント以外のシステム機能と Windows インターフェイス要素がすべて含まれます。 と書かれています。FindFirst等はWindows APIですから、できるかも。
yoshin

2016/07/20 10:36

プラットフォームはOSのことなんですね。ありがとうございます。 RTLが組み込めるか、試してみます。
yoshin

2016/07/21 00:55

rtlはコンソールアプリでも実行時パッケージに含まれていました。 そのためエラーの解消には至りませんでした。 素人の質問で申し訳ないのでが、 boost.filesystemを使う流れは、下記のような認識でよいでしょうか? ・boost.filesystemライブラリをダウンロード ・プロジェクト内でライブラリをリンク設定 ・コード内で、ライブラリをインクルード
episteme

2016/07/21 00:58

そーです。ダウンロードの後、ライブラリをbuildせんならんでしょうけど。
Chironian

2016/07/21 01:14

> rtlはコンソールアプリでも実行時パッケージに含まれていました。 > そのためエラーの解消には至りませんでした。 残念。システム系の機能はrtlに入れてくれればよいのに。 > boost.filesystemを使う流れは、下記のような認識でよいでしょうか? 基本的な手順はその通りです。 boostの多くの機能はヘッダのみインクルードすれば使えるのですが、残念なことにboost::filesystemはライブラリのリンクが必要です。 問題はプリビルドがあるかどうかです。C++Builder XE3用のプリビルドがあるかと言うと微妙かもしれません。なかったら自力でビルドする必要が有ります。 ネット情報は豊富です。が若干コツがいるので、うまくビルドできなかったら、別途質問を立て下さい。 後、もし、マルチプラットフォームの必要がないのでしたら、Windows APIを直接呼び出すのも有りと思います。 http://d.hatena.ne.jp/s-kita/20100129/1264776052 時間をかけることができるようでしたら、boostは非常に勉強になるので、boostを使う方をお薦めします。boostはマジで宝の山ですよ。
yoshin

2016/07/21 02:38

Chironianさん epistemeさん ご親切に回答いただきありがとうございます。 boostを使う方向で検討してみますので、この質問についてはクローズします。 本当にありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問