簡単な画像ビューワをC++(BCC Developer/Win32アプリケーション)で製作しています。(Windows 7 HP)
Windows7に付属の画像ビューワのようにウインドウ上の「←」「→」のボタンでフォルダ内の画像ファイルを(現在表示されている画像から)一つ次に進めたり、逆方向に一つ進めたりという機能を実装したいと思っているのですが、その方法で詰まっています。
現在はWin32APIの「FindFirstFile()」+「FindNextFile()」を使い以下の①~③の手順でフォルダ内のファイル情報を取得し、次の画像へ移動しています。
①FindFirstFile()、FindNextFile()で、現在表示されている画像が入っているフォルダ内のファイルを全て列挙。
ファイル名を文字配列に格納。(拡張子を見て画像ファイルでないものは格納しない)
②その文字配列の中で、「現在表示されている画像のファイル名」がどの位置にあるのか調べる。
③判明した位置から、その配列の並びで一つ下(一つ上)のファイル名を取得。
ただしこの方法では、(フォルダ内の内容が変わらないという保証が無い限り)一々フォルダ内のファイルを全列挙しなければならず、ファイル数が多くなれば処理の負担が大きくなります。
更に「文字配列の並びで一つ下、一つ上のファイル名を取得」していますが、これはエクスプローラーでその時にソートされている並びとは無関係なので、(例えばエクスプローラーがファイルを「サイズ」でソートしているときでも、この文字配列の並びにはそれは反映されません(自分が試した結果ではファイル名順になっている様です。))、
画像ビューワとしては非常に使いにくいものになってしまいます。
Win7付属のフォトビューワを見てみると、これはエクスプローラーのソート順に対応していますし、フォルダ内のファイルの数が多くなっても動作速度に変化はないように思えます。
同一フォルダ内のファイル巡回機能(一つ先のものに進んだり、前のものに戻ったり)の実装に当たってはどのような設計で製作すれば良いでしょうか。
(※調べていて、「シェル」というものの知識が必要なようで、いくつか関連するサイトを読んでいるのですが
http://www.kab-studio.biz/Programing/Co ... on/05.html
非常に難しく、また中々自分の目的の箇所(例えばエクスプローラーのソート順の取得など)を見つけられず今回この質問を書いています。シェルについての理解はその程度のものなので自分の今の力では難しい実装なのかもしれませんが、もし可能であればよろしくお願いします。)
フォルダ内のファイルの順次移動について
Re: フォルダ内のファイルの順次移動について
1.並び順
確かにWin32APIなどには、並び順の取得が見当たらないですね...
シェルでやるのがよいかもしれませんが、機種依存が心配な気はします。
上記の内容を xxxx.vbs のようなファイル名で保存してダブルクリックしてみてください。
C:\testの内容が、設定した順序でリストアップされます。こちらの環境では動作確認しましたが、そちらで動くかどうか分かりませんが...
(2行目で何かのアドレスを指定していますが、これが何なのか分かっていませんorz)
これをアプリから呼び出してやればよい、ということになるかと。。
(または、諦めて、アプリ上に「並べ替えメニュー」を作るかですね。。。)
ちなみに...
コマンドプロンプトから画像ファイル名を叩くと、Windows7に付属のフォトビューワが起動されるものの、「フォルダの並べ替え設定」とは関係なく、名前順で表示されるようです(FAT32だと違うかも)。
なので、フォトビューワは、「フォルダの並べ替え設定」を読み取っているのではなさそうです。
「その時の起動元のエクスプローラ」のウィンドウハンドル等からファイルの並び順を取得しているのかもしれません。ご参考まで。
2.負荷について
> ただしこの方法では、(フォルダ内の内容が変わらないという保証が無い限り)一々フォルダ内のファイルを全列挙しなければならず、ファイル数が多くなれば処理の負担が大きくなります。
⇒ 親フォルダの更新日時を確認することで、フォルダの内容が変わっていないかどうかを判断する、というのはどうでしょう。
または、Win32APIの
•FindFirstChangeNotification
•FindNextChangeNotification
•FindCloseChangeNotification
この辺でフォルダの更新を監視することもできます。
確かにWin32APIなどには、並び順の取得が見当たらないですね...
シェルでやるのがよいかもしれませんが、機種依存が心配な気はします。
FolderName="C:\\test"
Set ie=GetObject("new:{C08AFD90-F2A1-11D1-8455-00A0C91F3880}")
ie.Navigate FolderName
Do While ie.Busy Or ie.ReadyState<>4
WScript.Sleep 100
Loop
Set Folder=ie.Document.Folder
For Each FolderItem In Folder.Items()
WScript.Echo FolderItem.Name
Next
ie.Quit
C:\testの内容が、設定した順序でリストアップされます。こちらの環境では動作確認しましたが、そちらで動くかどうか分かりませんが...
(2行目で何かのアドレスを指定していますが、これが何なのか分かっていませんorz)
これをアプリから呼び出してやればよい、ということになるかと。。
(または、諦めて、アプリ上に「並べ替えメニュー」を作るかですね。。。)
ちなみに...
コマンドプロンプトから画像ファイル名を叩くと、Windows7に付属のフォトビューワが起動されるものの、「フォルダの並べ替え設定」とは関係なく、名前順で表示されるようです(FAT32だと違うかも)。
なので、フォトビューワは、「フォルダの並べ替え設定」を読み取っているのではなさそうです。
「その時の起動元のエクスプローラ」のウィンドウハンドル等からファイルの並び順を取得しているのかもしれません。ご参考まで。
2.負荷について
> ただしこの方法では、(フォルダ内の内容が変わらないという保証が無い限り)一々フォルダ内のファイルを全列挙しなければならず、ファイル数が多くなれば処理の負担が大きくなります。
⇒ 親フォルダの更新日時を確認することで、フォルダの内容が変わっていないかどうかを判断する、というのはどうでしょう。
または、Win32APIの
•FindFirstChangeNotification
•FindNextChangeNotification
•FindCloseChangeNotification
この辺でフォルダの更新を監視することもできます。
Re: フォルダ内のファイルの順次移動について
ご回答ありがとうございます。
プログラムも書いていただいて感謝しております。
折角なのに、まだ実行出来てはいないのが申し訳ないのですが
(これはVB Scriptでしょうか? 自分には読めなくて。ごめんなさい。)
少しずつ読めるように勉強して、まず内容を理解したいと思います。
是非使わせていただきたいと思っています。
今回、Win7付属のフォトビューワがいかにも自然にファイル巡回をこなしていたので、きっとそのための関数なりあるんだろうと思っていたんですが、教えていただいたコマンドプロンプトの件を考えても中々一筋縄ではいかない感じですね。
でも色々教えて頂いて助かりました。納得ずくで巡回の設計をどうするか考えていきたいと思っています。
ご回答ありがとうございました。また何かありましたらよろしくお願いします。
プログラムも書いていただいて感謝しております。
折角なのに、まだ実行出来てはいないのが申し訳ないのですが
(これはVB Scriptでしょうか? 自分には読めなくて。ごめんなさい。)
少しずつ読めるように勉強して、まず内容を理解したいと思います。
そうですね。自前で作る他ないのかもしれません。(または、諦めて、アプリ上に「並べ替えメニュー」を作るかですね。。。)
調べていただいて恐縮です。この挙動は興味深いですね。でも中々真似出来そうにないですね。。ちなみに...
コマンドプロンプトから画像ファイル名を叩くと、Windows7に付属のフォトビューワが起動されるものの、「フォルダの並べ替え設定」とは関係なく、名前順で表示されるようです(FAT32だと違うかも)。
なので、フォトビューワは、「フォルダの並べ替え設定」を読み取っているのではなさそうです。
「その時の起動元のエクスプローラ」のウィンドウハンドル等からファイルの並び順を取得しているのかもしれません。ご参考まで。
有難うございます。恐らくこの「フォルダを監視する」ということが無駄な列挙作業を減らせる良い方法だと自分も思います。⇒ 親フォルダの更新日時を確認することで、フォルダの内容が変わっていないかどうかを判断する、というのはどうでしょう。
または、Win32APIの
•FindFirstChangeNotification
•FindNextChangeNotification
•FindCloseChangeNotification
この辺でフォルダの更新を監視することもできます
是非使わせていただきたいと思っています。
今回、Win7付属のフォトビューワがいかにも自然にファイル巡回をこなしていたので、きっとそのための関数なりあるんだろうと思っていたんですが、教えていただいたコマンドプロンプトの件を考えても中々一筋縄ではいかない感じですね。
でも色々教えて頂いて助かりました。納得ずくで巡回の設計をどうするか考えていきたいと思っています。
ご回答ありがとうございました。また何かありましたらよろしくお願いします。