どうもお世話になっています。レゴラスです。
以前質問させて頂いたときは大変お世話になりました。
またお世話にならせて頂いてもよろしいでしょうか・・TT
(質問内容)
やりたいことは、
「カレントディレクトリにある拡張子がCSVの任意のファイル名の
ファイルのフルパスを取得する」方法です。
たとえば、C:/test/**.csv というふうに「**」の部分の
ファイル名は常にその時に応じて新しいファイル名でファイルを
作成するのですが、拡張子がCSVというファイルはそのディレクトリ
に一つだけです。
こういった場合、この「*****」の部分のファイル名も含めて、
カレントディレクトリにあるファイルのフルパスを取得する方法
を教えて下さい。既に出来上がったソフトで作成されるファイルの
パスを取得したいので、事前に作成したファイルの名前をどこかに
覚えさせておく。といったことが出来ません。
難しい質問して申し訳ございません。お時間が許す限りの範囲で
構いませんので教えて下さい。
よろしくお願い致します。。m(__)m
_fullpathっていうズバリな関数があります。
こんばんは、RAPTです。
lrさん>
> _fullpath
それは、相対パスから絶対パスを生成するものとか。
レゴラスさん>
SDKなら、::GetModuleFileName()という関数があります。
これで、実行ファイルの絶対パスを取得し、ファイル名部分
を*****.csvに置き換えれば良いのではないでしょうか。
Windows98/VC++6.0std/SDK-may2002/ATL3.0/WTL7.0
lrさんご解答ありがとうございます。
せっかく解答いただいたのですが、すいません。
私の質問内容が理解しにくい内容だったのかも知れません。
「_fullpath」は、相対パスからフルパスを取得できますよね。
おそらく、「カレントディレクトリ・・」っていう部分と混同されて
私の質問内容がおかしくなってしまったのかも知れません。。。
判りにくい質問内容でお手数おかけしたことを深くお詫び申し上げます。
あらためて質問させて下さい。
「任意のファイル名(ただし拡張子は[.csv])」を特定してそのフルパスを取得する方法
です。先ほど申しました「*****」という部分の任意のファイル名というのが特定できない
ために、_fullpathを使ってもフルパスが取得できないのです。
そういう理由で、カレントディレクトリの任意のファイル名(拡張子は.csv)という
条件だけで、その任意のファイル名を特定してフルパスを取得したい。
ということです。。また文章長くなってしまいましたね。。
ごめんなさい。どうかよろしくお願いいたします。m(__)m
私も引き続き自助努力進めます。
明日1日やり方考えて答えが出なかったらまたよらせてください。
では失礼いたします。
…で、私の回答は無視ですかい(T-T
別にいいんですけど。
ところで、私は、「カレントディレクトリ」を、実行ファイルがあるディレクトリ
と解釈しましたが、レゴラスさんがおっしゃっている、「カレントディレクトリ」
とは、実際には、どこのことなんでしょう? 何にとっての“カレント”なのか
によって、回答が変化すると思います。
あと、環境を書いてもらえるとありがたいです。
Windows98/VC++6.0std/SDK-may2002/ATL3.0/WTL7.0
なんでもよければMFCの解説で
>CFileFind クラスは、ローカル ファイルを検索します。このクラスは、
>インターネット ファイル検索を実行する CGopherFileFind と CFtpFileFind
>の基本クラスです。CFileFind には、検索の開始、ファイルの検索、および
>ファイルのタイトル、名前、またはパスを返すメンバ関数があります。
>インターネット検索においては、GetFileURL メンバ関数がファイルの
>URL を返します。
>CFileFind は、特定の種類のサーバーを検索するために設計された次の 2 つの
>MFC クラスの基本クラスです。CGopherFileFind は gopher サーバー専用であり、
>CFtpFileFind は FTP サーバー専用です。これらの 3 つのクラスによって、サーバー
>プロトコル、ファイル種別、またはローカルマシンあるいはリモート サーバーという
>場所に関係なく、シームレスなファイル検索機能をクライアントに提供します。
>次のコードで現在のディレクトリにあるすべてのファイルを列挙できます。
>各ファイルの名前が出力されます。
> CFileFind finder;
> BOOL bWorking = finder.FindFile(*.*);
> while (bWorking)
> {
> bWorking = finder.FindNextFile();
> cout << (LPCTSTR) finder.GetFileName() << endl;
> }
こんなのありますから
「*****」という部分の任意のファイル名というのが特定出来るんじゃないですか
カレントディレクトリって、GetCurrentDirectory()で取得できるパスじゃダメですか?
そのパスが示すところの拡張子csvなファイルを検索すれば
任意のファイル名が特定できるのでは?
あとは文字列の連結でフルパスになると思うのですが・・・
違うかしら。
http://homepage2.nifty.com/sak/w_sak3/doc/syspc/c_k09.htm
ワイルドカードを使って検索してるっぽい自作関数の例があります。
よく読んでないので趣向に合ってるかどうかは分かりませんが参考になれば幸いです。
こんにちは、RAPTです。
あらら、csvのファイル名も不明だったんですか。。
> C:/test/**.csv というふうに「**」の部分の
> ファイル名は常にその時に応じて新しいファイル名でファイルを
> 作成するのですが
とあったので、ファイル名は分かっているものだと思ってました。
失礼しました。
Windows98/VC++6.0std/SDK-may2002/ATL3.0/WTL7.0
>作成するのですが、拡張子がCSVというファイルはそのディレクトリ
>に一つだけです
このようにあったので「拡張子がCSV」のファイル1つだけを
CFileFind でさがして _fullpath ではダメなのかな?
作成するフォルダも一定でないのならほかにも考えないといけないと
思いますけど
昨夜はどうもお邪魔しました。
RAPTさん、ごめんなさい。あの文章書くのに15分かけてましたw
無視したんじゃないですよぉ~~w
woodさん、sugarさん、sotoさん
みなさん本当にありがとうございます。
昨日、ヘルプとにらめっこしてインターネット検索して
なんとか自己解決できましたw
このやり方が正しいのかわかりませんが、
一応解決したソース載せておきます。
もっとシンプルなやり方がありましたら
教えていただけるとありがたいですw
void main(){
HANDLE fileHandle;
WIN32_FIND_DATA findData;
fileHandle = FindFirstFile(C:\\TEST_DEV\\*.csv, &findData);
if(fileHandle != INVALID_HANDLE_VALUE) {
do {
if(!(findData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)) {
printf(拡張子csvのファイルはこれ: %s, findData.cFileName);
}
}while(FindNextFile(fileHandle, &findData));
}
FindClose(fileHandle);
}
あとは、FindFirstFileでセットするディレクトリは
目的のファイルが入っているディレクトリ=プログラムの
実行ディレクトリ(カレント)なのでそいつを取得して渡して
やろうと思ってます。
皆さんどうもありがとうございました。
またよろしくお願いいたします。m(__)m