Windows 95からあるGetFileSize()/GetFileSizeEx()(こちらはWindows 2000から)を見たとき「なんでハンドル渡すんだろう」とすごく疑問でした。ファイル名でいいじゃないと。まぁ、自プロセス内で引き渡すにはハンドルのほうがいいけれど。
当然ですがCreateFileで開いたとき、対象のファイルがロックされていると、ファイルサイズの取得もできないんですよね。しばしば忘れていてはまります。
GetFileAttributesEx()やWMIのCIM_DataFileならファイルがロックされていても大丈夫。PowerShellならこう。
PS>$a = Get-WmiObject -Class CIM_DataFile -filter "Name = 'ファイル名'" PS>$a.FileSize
あ、Windows 2000ではWMIにバグがあって2GB超のファイルサイズ取れないんですね。
CIM_DataFile クラスが正しくないか null 値では、Windows 2000 の 2 GB より大きいファイルを返す
この辺はあとでmkIIに書く。
(追記)GetAttributeEx()のリンク先間違いを修正。id:wraith13さんありがとうございます。