none
Canonのデジカメからファイル一覧を取得したい RRS feed

  • Question

  • やりたいことは単純で、CanonのデジカメをPCにUSBで接続して、①そのデジカメ内のファイル一覧を取得して、サムネイル表示。②ユーザーにその中からファイルを選ばせて、選んだファイルをPCのHDDへコピーする。これだけです。

    デジカメがD:\やE:\など、ドライブ名のついたリムーバブルドライブとして認識されれば話は簡単です。①も②も、その前提なら問題ありません。

    ところが、今回どうしてもCanonのIXYというデジカメを使わなれければならず、このデジカメは、困ったことに、ドライブ名のあるリムーバプルドライブとしてWindowsが認識してくれまぜん。「ポータブルデバイス」としてだけ認識されています。

    また、ファイルダイアログからは、このポータブルデバイスを選び、更に下層のファイルまでたどっていけば選択はできるので、ファイルを選択して、その戻り値のフルパス名を使って処理しようとしたところ、

    C:\Users\ユーザー名\AppData\Local\Microsoft\Windows\Temporary Internet FIles\Content.IE5\XVMHUDRT

    という、得体の知れないフォルダの名前が返ってきました(笑)。

    デジカメそのもののパスではなく、バックグラウンドで勝手にCドライブにファイルのコピーを作られ、そのパスが戻ってきているようです。これでは使い物になりません。

    単純に①②がしたいだけなのですが、何か手段はあるでしょうか?


    マイコンピュータから見たデジカメデジカメ接続時のフォルダ名
    • Edited by minami259 Sunday, September 9, 2012 11:52 PM
    Sunday, September 9, 2012 11:49 PM

All replies

  • 私はポータブルデバイスを扱った経験がなく、ネットを検索しただけですが、以下などが参考になりそうです。

    WPD: Enumerating Content
    http://cgeers.com/2011/06/05/wpd-enumerating-content/

    WPD Content Enumeration in C#
    http://blogs.msdn.com/b/dimeby8/archive/2006/12/12/wpd-content-enumeration-in-c.aspx

    以上はいずれも、PortableDeviceApi 1.0 Type Libraryおよび、PortableDeviceTypes 1.0 Type Libraryを参照設定しています。


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/

    Monday, September 10, 2012 12:58 AM
    Moderator
  • 返信ありがとうございます。

    貼って頂いたリンク先を参考にして、一応、デジカメそのもののFriendlyNameというものと、内部のフォルダやファイルのID,名前は取得できるようになりましたが…

    ただ、ファイル名が列挙できるだけだと、結局、肝心の画像データを読みだすことはできず①のサムネイル表示も、②のファイル本体のコピーもできません。

    なんとかファイルそのものを普通に画像ファイルとして読み込むことはできないでしょうか? ファイル名だけは一応わかるものの、肝心のフォルダ名が指定できないので、ファイルのフルパスのURIを得ることができず、困ってしまっているのですが…

    (フォルダ名というか、多分「リムーバブル記憶域」以下はここで得られる情報を使えると思うのですが、肝心のデジカメを指定する方法がわかりません)


    • Edited by minami259 Tuesday, September 11, 2012 1:51 AM
    Tuesday, September 11, 2012 1:48 AM
  • 以下が参考になりませんでしょうか? このブログから、サンプルのコードもダウンロードできるようです。

    WPD: Transferring Content
    http://cgeers.com/2011/08/13/wpd-transferring-content/


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/


    Tuesday, September 11, 2012 2:42 AM
    Moderator
  • 度々返信ありがとうございます。前回のリンクの続きの記事のようですね。ブログには過去の記事へのリンクはありましたが、それより後の記事へのリンクはなく見落としていました。

    こちらの新たなリンクの方のサンプルコードをダウンロードし、実行したところ、ブログのコメント欄に他の方も書いているエラーが出てしまいましたが、別の方のコメントにあった

    Marshal.ReleaseComObject(sourceStream);
    Marshal.ReleaseComObject(wpdStream);

    を追加してやることで、エラーは消え動作するようになりました。元のソースだと、拡張子もないIdをファイル名としてファイルを作る仕様になっていましたが、代わりにNameで作ってやるようにしたところ、無事に、○○.JPG などの元のファイル名で、そのまま画像ファイルとして保存してくれるようにはなりました。

    が、いかんせん遅いです。JPGファイル2枚だけ(容量は1枚3M前後)をコピーするだけで、4秒ほどかかってしまいます。もっと枚数が増えたら、数十秒~数分と、飛んでもないことになりそうです。HDDにコピーしているから仕方がないのか…? よくわからないところですが。

    同じデジカメをファイルダイアログなどで開いた場合は、一瞬で画像のサムネイルが表示できるのに比べると、1/100かそれ未満か、段違いの遅さです。

    なんとか、ファイルダイアログで開いた時並みに一瞬で表示できるようにしたいところですが…

    Tuesday, September 11, 2012 5:33 AM
  • 確かにちょっと遅い気がしますね・・・。他の方法として、また検索しただけで申し訳ないのですが、以下の例が見つかりました。

    Copy/Move Files from Portable Device
    http://dev.flauschig.ch/wordpress/?p=212


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/

    Tuesday, September 11, 2012 8:58 AM
    Moderator
  • エクスプローラーやファイルを開くダイアログ類でファイルを列挙する機能、サムネイルを表示する機能は IShellFolder やその周辺インターフェースを用いることで実現されています。
    trapemiya さんのリンク先も IShellFolder でアクセスする方法で紹介されているので、こちらだと同じアクセススピードを期待できるかもしれません。

    もっとも、”速い”のが単純にエクスプローラーのサムネイルキャッシュにキャッシュされているだけという可能性も否定されていないので、一瞬とは行かないかもしれませんね。

    // 物理パスは取得できないので、Copy などで一度ローカルにコピーしないと
    // 一般的なファイルアクセスはできないと思います。
    // iPhone 相手に実験したときのやりとり

    Tuesday, September 11, 2012 2:07 PM
    Moderator
  • 度々返信ありがとうございます。

    今度貼って頂いたページは、全く理解できませんでした…説明もほとんどないし、サンプルソースの一部も載ってはいましたが、動作させることもできませんでした。

    せっかく教えて頂いたのにすみません。


    Wednesday, September 12, 2012 5:30 AM
  • 厳しい言い方になるかもしれませんが、「理解できない」「説明もほとんどない」と書かれていますが、回答側に何を期待しているのでしょうか?
    わかるような文献を探してきて欲しいということや、別のやり方を教えて欲しいということであれば、甘えかなと思います。
    プログラマーなのですから、わからないのであれば、キーワードを拾って検索しまくって、いろいろと情報を拾いましょう。

    IShellFolder は Shell が提供するファイル・フォルダーを列挙するインターフェースであり、そこからサムネイル取得のインターフェースをとれたり、ファイル操作ができたりします。
    該当のページがわかりづらい、サンプルがないなどであっても、IShellFolder で探せば別の解説サイトやサンプルを見つけられると思うので、基本的なところをまずつかんでください。
    その上で、もう一度同じページに挑めば、理解が進むのではないでしょうか。

    Wednesday, September 12, 2012 2:54 PM
    Moderator
  • 物理パスは取得できないので、Copy などで一度ローカルにコピーしないと

     チラ見しかしていませんが、「WPD: Transferring Content」の所、FileStream を二つ開いていますよね。これ、Stream を引き数に Bitmap インスタンスを作成し、サムネイル向けに Clone してから元のは破棄する、ってのはダメなんですかね?それを Task なりでマルチ スレッドにすれば、速くなる…かも。データ転送はマルチにならないから、あまり変わらないかも。


    Jitta@わんくま同盟

    Thursday, September 13, 2012 12:41 PM
  •  チラ見しかしていませんが、「WPD: Transferring Content」の所、FileStream を二つ開いていますよね。これ、Stream を引き数に Bitmap インスタンスを作成し、サムネイル向けに Clone してから元のは破棄する、ってのはダメなんですかね?それを Task なりでマルチ スレッドにすれば、速くなる…かも。データ転送はマルチにならないから、あまり変わらないかも。

    できると思いますよ。
    私が書いた、あの一文は IShellFolder 経由のものに限って言っていたので、この可能性を閉ざすつもりはありませんでした。

    それとは別の、IShellFolder 路線を実験してみる視点で、Windows 7 API Code Pack を使ってサムネイルを取得する サンプル は書いてみましたが、同じデバイスに適用できるかどうかと、求めるスピードが出るのかはわかりません。
    // こちらのルートはファイルコピーまでの道がないので、直接 IShellFolder などを扱わないといけないかも。

    Thursday, September 13, 2012 2:04 PM
    Moderator