にしし ふぁくとりー(西村文宏 個人サイト)

Presented by Nishishi via Movable Type. Last Updated: 2015/09/22. 13:24:37.

カレントディレクトリで煮詰まった…

煮詰まりました…。解決したけど。

今、「Fumy RSS & Atom Maker」に、全自動実行機能を搭載すべくコーディング中です。この機能は、指定したプロジェクトの読み込みからRSS/Atomフィードの出力まで、一気に無操作で完了させる機能です。
これを使えば、ユーザは、ソフトを起動するためにダブルクリックするだけで、指定したウェブサイト用のRSS/Atomフィードの作成を完了できます。

この機能を実現するためには、プログラムに直接与えられたパラメータ(引数)を解釈する必要があります。
とりあえず、パラメータとして、「 /A:ProjectFile.frp 」とかいう感じでプロジェクトファイル名(ここでは ProjectFile.frp )を与えれば、起動直後にそのプロジェクトファイルを読み込んで、指定通りの情報抽出を行って指定の位置にRSS/Atomフィードを出力するようにしました。(まだ、できあがってません。そういう仕様を考えた、というだけ。^^;)

で、せっかくパラメータを解釈するようにするんだから、ついでに、プロジェクトファイルが直接パラメータに与えられた場合に、そのプロジェクトファイルを読み込んだ状態で起動する仕様も加えることにしました。

そうするとどうなるかというと、ソフトウェアのアイコン(実行ファイルorショートカット)に、プロジェクトファイルをドラッグ&ドロップすると、そのプロジェクトファイルが読み込まれるようになります。(テキストエディタとかでそういう操作をしてる人も居るんじゃないかと思いますが。)
(ちなみに今は、どんなファイルをドロップしても無視するだけ。)

まあ、そんな機能、必要なさそうですけど、まあ、ついでです。^^;

でー。
煮詰まりました。

ソフトウェアを起動してから、「開く」メニューとかでプロジェクトファイルを開けば問題なく読み込めるのに、パラメータ経由で開くと(つまり、さっき言ったように、実行ファイルにプロジェクトファイルをドロップして起動する方法で開くと)、なぜか読み込めず、デフォルトの設定が開かれてしまいます。

開発環境(Borland C++ Builder)の機能で、実行時引数を指定する方法で、同じ状況を再現して実行すると、なぜか正しく読めます…。(^^;;;

さっぱり分かりません。^^;

仕方がないので、要所要所にブレークポイントを設けてステップ実行してみたりしたんですけど、なかなか原因がつかめませんでした。

この問題の原因究明に、2時間くらいかかったと思います。^^;;;
結局、要所要所で変数の中身を確認していって、どうやら、プロジェクトファイルの中に記述されている各設定ファイルのファイルパスが有効かどうかをチェックするメソッドを実行した直後におかしくなる(パスが無効だと判断してデフォルトの設定を読むように指示してしまう)ことが分かりました。^^;

プロジェクトファイルの中には、各設定ファイルのファイル名が保存されているのですが、これらは、ソフトウェアと同じフォルダ内にある限り、フルパスではなく(パスのない)ファイル名だけを記述するようにしてあります。その方が、ソフトウェアを他のフォルダやドライブに移動させても問題なく使えるからです。

で、ファイルパスが有効かどうかを判断するメソッドの中では、単純に保存されている文字列を使ってファイルが存在するかどうかをチェックしていました。だから、パスのないファイル名だけで、ファイルが存在するかどうかをチェックしてたわけですね。

フルパスではない場合、それはソフトウェアと同じフォルダにあるわけで、ソフトウェアのあるフォルダはたいていカレントディレクトリ(フォルダ)なので(^^;)、今までは問題なかったのでしょうが、どうも、ドラッグ&ドロップでファイルを実行ファイル(orショートカット)に渡した場合、カレントディレクトリは、実行ファイルのあるフォルダではなく、なんと、ユーザのホームフォルダ(?)になっちゃうようでした。(確認済み)

確認してみると、プログラムを単純にダブルクリックで実行した場合、カレントディレクトリは、そのプログラムのあるフォルダになります。
(例: D:\Programs\rssmaker\ )
でも、プログラムにファイルをドラッグ&ドロップして実行した場合、カレントディレクトリは、ユーザのホームフォルダになります。
(例: C:\Documents and Settings\UserName\ )

…こんな仕様になってたのか。Windows…。
これは、Windows XPの話なので、他のWindowsでは異なるかも知れませんが。

何にしても、カレントディレクトリがどこか確実に分かっている状況でない限り、(パスのない)ファイル名だけでファイルを扱っちゃダメってことですね。^^;
…いや、それは分かってたんだけど。分かってたし、フルパスを返すメソッドもちゃんと用意はしてたんだけど。そこだけ使うのを忘れてたようです。ぐへ。

というわけで、フルパスで調べるように修正して解決。
…2時間かかっちゃったよ…。^^;;;

で、それは解決したので、めでたしめでたし…でいいんだけど。
あともう1つ、この試行錯誤の途中で判明した問題があります。^^;

「開く」メニューを使ってプロジェクトファイルを開く際、ダイアログには、プロジェクトファイルしか一覧に出てきません。(拡張子.frp) でも、2~3の操作をすれば、それ以外のファイルも強引に読ませることができます。
このとき、プロジェクトファイルではないファイルを、プロジェクトファイルであるかのように読ませると、ちょっと問題が出ます。^^;

さっきも言ったような気がするけど、このソフトは、プロジェクトファイルから各設定ファイルの所在が読めなくても、エラーにはせず、デフォルトの設定を読む仕様になっています。
で、プロジェクトファイルではないファイルをプロジェクトファイルとして読ませると、当然、1つも設定ファイルの所在は読めないのですが、エラーにはならず、すべての設定がデフォルトの状態で起動します。

そこまではいいのですが、そもそもそういう事態を想定していなかったので(^^;)、プロジェクトファイルとして指定された(実際にはプロジェクトファイルではない)ファイルを、そのまま「現在使用中のプロジェクトファイル」として扱ってしまいます。

これでどういう問題が起こるかというと…。

ソフトウェアを終了したときに、「現在使用中のプロジェクトファイル」に、そのときの設定内容を保存してしまいます。

つまり。

プロジェクトファイルではないファイルに、プロジェクトの各種情報を追記しちゃいます。^^;;;
もし、バイナリファイルとかを指定したとしたら(※そんな人は居ないと思いますが)、ファイルを破壊してしまいます。

このことは、現在公開しているバージョンまででは特に問題にはならないと思うのです。そもそも、プロジェクトファイル以外のファイルをプロジェクトファイルとして読み込ませるには、自らの意志で数回クリックしたり、キーボードからいくつか入力してファイルを指定しないといけませんから。
通常の「開く」操作で、いきなり無関係なファイルが現れることはありませんし。

ただ、今開発中のバージョンからは、実行ファイルorショートカットにファイルをドロップすることでも開けるようになるので、誤って全然関係ないファイルをドロップしてしまう可能性も高くなるわけで、このままでは困ったことになる可能性があります。^^;;;

…ということに気づいたので、正しいプロジェクトファイルではないファイルを読ませようとしたら、エラーメッセージを出すと同時に、内部でもそのファイルをプロジェクトファイルであるとは扱わないように修正しました。^^;;;

うひょ。

というわけで、現在のバージョン(Ver 0.51β)以下をご使用の方々は、(そこまでする人は居ないと思いますが^^;)プロジェクトファイルではないファイルをプロジェクトファイルとして読ませないようご注意下さい。

ちなみに、そう操作するには、
1. 「開く」メニューorボタンで「開く」ダイアログを出す
2. 「他のファイル」ボタンをクリック
3. ファイル名欄に、「*.*」と入力
4. 適当なファイルを選択
…という操作が必要です。

たぶん、3番目の操作を実行するユーザはほとんど居ないと思うので、間違って読んじゃう人は居ないと思います。^^;
「ファイルの種類」欄では、選択肢がない(よくある「すべてのファイル(*.*)」という項目はない)ので、ファイル名欄にワイルドカードを使ったりして指定しないと、プロジェクトファイルではないファイルを指定はできません。

※もっとも、拡張子frpを使っている、他のソフトのファイルがあった場合、それは出てきてしまいますが…。

何にせよ、今開発中のバージョンで解決させましたので…。^^;;;

ええと、長くなったけど、今回の話の要点は、カレントディレクトリはどこか分からんことを前提にプログラミングしないとダメ、ということでした。^^;

コメント

コメント数: 0件

コメント投稿欄 この日記に対するコメント投稿を歓迎します。

保存しますか?



※本文中にURLは書けません。(書くと投稿が拒否されますのでご注意下さい。)

※投稿内容は、実際にページ上に掲載される前に、管理者によって確認される設定にしている場合があります。その場合は、投稿後にその旨が表示されます。たいてい1~2日以内には表示されるはずですので、気長にお待ち願います。m(_ _)m

トラックバック

このエントリーへのトラックバックURLを表示するにはここをクリック
※スパム防止のため、トラックバックURLは別ウインドウで表示します。(JavaScriptが有効でないと表示されません。)

--- 当サイト内を検索 ---