SANYOのデジカメ DSC-CG65が修理から帰ってきた。
今回は無償で済んだ。メイン基盤交換だそうで、なんで壊れたのかはわからない。
うちにはSDHCが読める環境がないので、デジカメをUSBで繋ぐとUSBマスストーレジとして見れるのでそれで転送する。
普通の静止画の写真の方は、picmvと言うソフトでメモリカードからNASに転送している。転送しながら縮小版が作れたり、好きなファイル名にできるので重宝している。
一応、picmvは拡張子での指定ができるので、DSC-CG65のMP4もいけるのかも知れないけど、静止画とう動画は別の場所に置きたいとか、ディレクトリとファイル名のルールも変えたいとかあって、picmvとは別管理にしたい。
そのままだと、SANYxxx.MP4とかそう言うファイル名で、カメラ側でファイル名をリセットしてしまうとファイル名に重複が出てしまうのと、EXIFとかと違ってMP4(MPEG-4AVC/H.264)はまだexplorerでは撮影日時などの情報を見ることができないと言うのがあり、ファイル名を撮影日時にしておきたいところ。
とりあえず、Visual C# 2005 Express Editionがあるので、C#でmp4をコピーするプログラムを作ろうと思い立つ。
でも、MP4の中を読む方法がわからないので、カメラから転送するときのファイルの更新日時をベースにコピー先のファイル名を生成することにする。
# この程度なら、perlとかでさくっと作ったほうが全然早いかも知れないな。
とにかく、一晩でやっつけで作ってみた。例によってエラーチェックとか全然なし。C#もランタイムで例外が発生してくれるから気が楽(?)だ。
C#のプロジェクトは、どのファイルが必要なファイルか良くわからないので、svnのリポジトリとかにはまだ入れていない。なので、公開は今のところ考えていない。需要もないだろうし(笑)。
と、言うわけで、この記事では(ほぼ)初めてのC#プログラミングではまった所を列挙してみる。
後は、リポジトリにどのファイルを入れれば良いのかがわかって、かつVisualStudioがSVNのクライアントになれればいいんだけどなあ。
今回は無償で済んだ。メイン基盤交換だそうで、なんで壊れたのかはわからない。
うちにはSDHCが読める環境がないので、デジカメをUSBで繋ぐとUSBマスストーレジとして見れるのでそれで転送する。
普通の静止画の写真の方は、picmvと言うソフトでメモリカードからNASに転送している。転送しながら縮小版が作れたり、好きなファイル名にできるので重宝している。
一応、picmvは拡張子での指定ができるので、DSC-CG65のMP4もいけるのかも知れないけど、静止画とう動画は別の場所に置きたいとか、ディレクトリとファイル名のルールも変えたいとかあって、picmvとは別管理にしたい。
そのままだと、SANYxxx.MP4とかそう言うファイル名で、カメラ側でファイル名をリセットしてしまうとファイル名に重複が出てしまうのと、EXIFとかと違ってMP4(MPEG-4AVC/H.264)はまだexplorerでは撮影日時などの情報を見ることができないと言うのがあり、ファイル名を撮影日時にしておきたいところ。
とりあえず、Visual C# 2005 Express Editionがあるので、C#でmp4をコピーするプログラムを作ろうと思い立つ。
でも、MP4の中を読む方法がわからないので、カメラから転送するときのファイルの更新日時をベースにコピー先のファイル名を生成することにする。
# この程度なら、perlとかでさくっと作ったほうが全然早いかも知れないな。
とにかく、一晩でやっつけで作ってみた。例によってエラーチェックとか全然なし。C#もランタイムで例外が発生してくれるから気が楽(?)だ。
C#のプロジェクトは、どのファイルが必要なファイルか良くわからないので、svnのリポジトリとかにはまだ入れていない。なので、公開は今のところ考えていない。需要もないだろうし(笑)。
と、言うわけで、この記事では(ほぼ)初めてのC#プログラミングではまった所を列挙してみる。
- ファイルダイアログではファイルしか選択できない
コピー元ディレクトリとコピー先ディレクトリを指定して、コピーするプログラムにしようと思ったのだけれど、最初に見つけたOpenFileDialogやSaveFileDialogと言ったコンポーネントでは、ファイルは指定できるけれどもディレクトリは指定できない。
悩んだ挙句、FolderBrowserDialogと言うのを使うとディレクトリが指定できることがわかった。
使いにくい。 - マルチスレッドでのコンポーネントへのアクセス
ネットワーク経由での動画のコピーにはかなり時間がかかるので、マルチスレッドでコピーしつつプログレスバーを出すことにした。
デザイナの画面でBackgroundWorkerと言うのを作ってあげると、別スレッドが起こせる。
このスレッドでコピーしつつ、プログレスバーの更新をしようと思ったら、「作ったのと違うスレッドが触ろうとしてますぜ」みたいなランタイムエラーが出る。
マニュアルを見ると、コントロールがスレッドセーフではないから、別スレッドから直接触ってはいけないらしい。
わざわざスレッドのProgressChangedみたいなイベントハンドラを実装して、そこからコントロールを触るようにする。 - 配列のソート
Javaで言うComparatorみたいなものとして、IComparerとか言うのがある。これの実装クラスを作ってあげて、Array.Sort()に配列と一緒に渡してあげるとソートができる。ディレクトリ内のファイルの一覧を更新日順でソートしてみたけど、この辺は自分で作らなくてもありそうなもんかな。 - リファクタリングは便利
さすが統合開発環境と言うべきか、一度フォームに貼り付けたコントロールの名前を変えたり、ソース上でメソッド名を右クリックして[リファクタ]→[名前の変更]を選ぶと簡単に名前が変更できる。
eclipseとかでも当たり前だけど、便利な機能だ。 - 設定の保存
コピー元とコピー先のディレクトリをユーザ設定として保存したくて、調べてみた。
マニュアルによると、デザイナのプロパティで設定の名前をつければあとは勝手にやってくれるようなことが書いてあるんだけど、これがなかなかわからなかった。
VBだと自動でやってくれて、VB以外だと自前でSettings.Save()を呼ばないといけないと書いてある。
でも、Settings.Save()とかやってもコンパイルエラーになってしまう。
最終的に、hogehoge.Properties.Settings.Default.Save() で保存できることがわかった。(わかってから読み直すとマニュアルにもそう書いてあるんだけど、「Default」の部分が書けなくて悩んでいた) - インストーラの署名
ビルドメニューから発行を選ぶとインストーラが作れる。
このとき、プロジェクトの設定の署名にある「ClickOnceマニフェストに署名する」の設定にしたがってインストーラが署名される。
デフォルトでオレオレ証明書が作られるんだけど、こいつの発行者が「マシン名\ユーザ名」になって変えられない。
ユーザ名にリアルな名前を使っているので、これはあまり嬉しくない。
Windowsの証明書ストアからも持ってこれるようなので、以前ブラウザ用のクライアント証明書を作ったときと同じように証明書を作ってストアにインポートし、それを選択してインストーラを作ってみた。
これ、仕事でやってる人はオレオレ証明書ってわけにはいかないだろうし、どうやっているのかな?
後は、リポジトリにどのファイルを入れれば良いのかがわかって、かつVisualStudioがSVNのクライアントになれればいいんだけどなあ。
カテゴリ
プログラミングトラックバック(0)
このブログ記事を参照しているブログ一覧: C#でプログラミング
このブログ記事に対するトラックバックURL: https://www.wizard-limit.net/cgi-bin/mt/mt-tb.cgi/1321
コメントする