開発者の備忘

「起」と「結」しか書かないので詳細はご自分でお調べください

【C#】メディアの作成日時を取得したい

メディアの作成日時順にファイルをソートしたかったので
GetDetailsOfで取得しようとしていた。

結果

取得できた。


でも、別のPCで試したら取得できなかったので注意。
カスタマイズすれば取得できるかも?
詳細は以下にて。

やりかた

以下はソースの一部を切り出したもの

FolderItem item;
Folder folder;
ShellClass shell = new ShellClass();
String refFilePath;
String refFileName;

// 参照先パスとファイルを分割
folder = shell.NameSpace(refFilePath);
refFileName = file.Substring(file.LastIndexOf(@"\") + 1);

folder = shell.NameSpace(refFilePath);
item = folder.ParseName(refFileName);

String tmpDate = folder.GetDetailsOf(item, 208);

解説

ShellClassはShell32を参照しないと使えない。
参照方法は別途記載する。

phen1208.hatenablog.com


最終的には「tmpDate」にメディアの作成日時が格納される。


最後の行でメディアの作成日時を取得している。
第一引数は対象のFolderItemオブジェクト。
第二引数は取得したプロパティの値の何番目のデータかを指定している。


個人的には第二引数に指定する値が謎だった。
他の参考ブログを確認して該当する番号を指定しても取得できないから。


ではなぜ「208」を指定しているかというと自分で調べたから。
調べ方はシンプルで、0番目から500番目までの値を全部出力してみた。

for (int i = 0; i < 500; i++)
{
System.IO.File.AppendAllText(@"C:\Users\User\work\test\test.txt", folder.GetDetailsOf(item, i) + "\n\r");
System.Diagnostics.Debug.WriteLine(folder.GetDetailsOf(item, i));
}


すると、以下のようにファイルに出力された。

f:id:phen1208:20190526003424p:plain
test.txtの内容


ちなみに、実際のプロパティは以下。

f:id:phen1208:20190526003529p:plain
対象ファイルのプロパティ



お!235番目に出てるじゃん!
と、意気揚々と234を指定(0スタートだから)しても空文字しか取得できなかたった。

これが2番目の謎。


仕方がないのでループ200回目あたりから確認すると208番目にメディアの作成日時があった。
なので、「208」を指定しているのだ。



無事、メディアの作成日時順にソートできたけど・・・

もともとの用途は、
うちのビデオカメラで撮った動画をPCに入れると撮った日付順にソートされないためだった。
さらに作成日付や更新日付もPCに入れた日時という不親切仕様。

なので、メディアの作成日時順にリネームするツールを作っていた。


で、ツールを作った開発環境は僕のデスクトップPC。
動画を編集するのは家族共有のノートPC。
なので、ツールはノートPCで使用する。


僕のPCでは問題なくメディアの作成日時順にファイルをソートできた。
ファイル名にメディアの作成日時を設定することもできた、

でも、実際にexeをノートPCで使ってみるとメディアの作成日時が取得できなかった。

原因は調べてないからわからないけど、たぶんプロパティの取得位置が変わったのではないかと思う。
だから208じゃ取ってこれないのかなあ・・・
まあ上のfor文ですぐ調べられるんだけどね。


しばらくは僕のほうのPCでリネームすることにしました。

【C#】クラスやメソッドがなぜか使えない問題解決

前記事

phen1208.hatenablog.com


他にも参考サイトに載ってるメソッドやクラスが使えなくて困った。



いろいろ試した

.NET FramWorkが古いんじゃないかとか
Visual Studioが古いんじゃないかとか
上記二つのバージョンが一致してないんじゃないかとか
いろいろ調べた。



ちなみに今のバージョンは
.NET FramWork : 4.7
Visual Studio : 2017


問題ない。
参考サイトのほうがバージョン古いし。

原因

プロジェクトをWPFで作成していたから。
Windowsフォームを作成しなおしたらコンパイルエラーが出なくなった。


WPFとはなんぞや・・・

【C#】 他コントロールを使おうとしたらStackOverflowException発生

ソース

namespace DefictBook
{
    public partial class MainWindow : System.Windows.Forms.Form
    {
        public static MainWindow mainCtl;

        public MainWindow()
        {
            InitializeComponent();

            mainCtl = new MainWindow ();

            // initPanelにメインパネルをリンクさせる
            initPanel.Controls.Add(mainCtl);
        }

    }
}

理由

呼び出したいクラスは「MainPanel」



なのに


 mainCtl = new MainWindow ();


って


そりゃあオーバーフローするわ・・・


コンストラクタでインスタンスを無限に作ってたためでした。


適度に休憩を挟んで頭をリフレッシュしてからコーディングしましょう。
私のおすすめは甘いものを食べる

【C#】DialogResultのOKが使えない

以下の画像のように、OKを設定するとエラーが出る。


f:id:phen1208:20190519233225p:plain



なぜだ・・・



んん?


f:id:phen1208:20190519233538p:plain



本来、dialogResultはSystem.Windows.Formsの中にあるはずなのに、出てこない


におうぞ・・・




と、思って調べたけどわからなかった・・・・
「System.Windows.Forms.DialogResult.OK」みたいにフルパスだとコンパイルエラー回避できる。





おそらく参照設定ミスってるんだと思うけど・・・




ご存じの方がいらっしゃればご教授お願いします。

【SQL】外部キーの依存先が削除されるときに依存元の行も同時に削除される方法

既存機能と同じような機能を作ってるときに自分が作ったものは外部キー制約でエラーになった。
「既存の機能はどーなってるんだ?」と10分ほど悩んだので備忘。

CASCADE

テーブルをCREATEするときにCASCADEを設定すれば、
外部キーで依存しているテーブルの行も自動的に消してくれる。
便利。

CREATE hoge(
id char(6) REFERENCES fuga(fuga_id) ON DELETE CASCADE,
no integer,
name char(12)
);

転職先、決まりました。

転職してから1年8か月くらい。
早くも転職することにしました。

きっかけ

妻がどこからか仕入れてきた「平均年収全国ワーストランキング」。
その上位100位以内に僕が所属する会社が入っていたことがきっかけ。


僕としては、
SESで派遣される働き方はもともと嫌悪感あったし、
会社にも特に恩を感じもしないし、
仲いい人もいないから今の会社にこだわりはなかった。



まあでも、転職してまだ1年半くらいしか経ってないし、機械学習も学び始めたところだから1年後くらいを目途にゆっくりよさげな会社を探していこうかなあ、と思ってた。
そしたら、妻がどこからか仕入れてきた会社があったので応募したところ、内定をいただいたので転職することにした。



ありがたいことに一部上場企業の子会社から内定をいただけた。
新卒でSES事業の会社に就職した人の順当なキャリアパスかな。



これからは今まで以上に仕事に真摯に取り組めそうだ。

【Python】pygameをインストールしたけど使えない

発端

pythonでゲームを作ろうと思い、pygameをインストールしたけど、何故かつかえない。



何をしたか

以下のサイトを参考にpygameをインストール
sites.google.com



インタプリタで確認すると、エラーとなる

>>>import pygame
Traceback (most recent call last):
  File "tes.py", line 1, in <module>
    import pygame
ModuleNotFoundError: No module named 'pygame'

解決策

apt-getでインストールすると使えないみたい。
pipを使用してインストールをする

pip install pygame


すると、うまくできた。

>>> import pygame
pygame 1.9.4
Hello from the pygame community. https://www.pygame.org/contribute.html
>>> print(pygame.ver)
1.9.4