ページ 11

リストボックスにファイル作成日時順に並べたい

Posted: 2005年7月24日(日) 16:44
by Mario2
以下のようなものを使って、ListBoxに項目を追加しています。

コード: 全て選択

Sub MainWnd_CommandButton1_Click()
SearchFile=FindFirstFile("W:\音楽\*.mp3",Win32Data)
Do
If SearchFile=INVALID_HANDLE_VALUE Then
MessageBox(0,0,0,0)
Else
'MessageBox(0,Win32Data.cFileName,0,0)
Num=Num+1
wsprintf(NumStr,"%04u",Num)
d=NumStr+" - "+"W:\音楽\"+Win32Data.cFileName
SendMessage(hList,LB_ADDSTRING,0,StrPtr(d))
'SetDlgItemText(hMainWnd,EditBox1,Win32Data.cFileName)
FindNextFile(SearchFile,Win32Data)
If a=Win32Data.cFileName Then Exit Do
a=Win32Data.cFileName
End If
Loop
	FindClose(SearchFile)
num=SendMessage(hList,LB_GETCOUNT,0,0)
SetDlgItemText(hMainWnd,Static1,"項目数:"+Str$(num))
End Sub
hList=GetDlgItem(hMainWnd,ListBox1)です。
また、Win32Data As WIN32_FIND_DATA、nom As Longです。

これで、ListBoxに名前順に追加していると、名前順になります。
(「スタイル」の「ソート」のチェックははずしています。)
(↓こういう風になります↓)
0001 - W:\音楽\15○○.mp3
0002 - W:\音楽\ど○○○○○.mp3
(↑こういう風になります↑)

自分がしたいことは、ファイル更新(作成)日時順ではないと、ファイルを追加したとき、nom関数の数字が、ファイルと追加する前と一致しないので、変動の少ない、ファイル更新(作成)日時でソートしたいのです。
(↓こういう風にしたいです↓)
0001 - W:\音楽\ど○○○○○.mp3
0002 - W:\音楽\15○○.mp3
(↑こういう風にしたいです↑)
0002の作成日 > 0001の作成日
 (新しい)  >  (古い)


説明が分かりにくいかもしれませんが、よろしくお願いします。

Re: リストボックスにファイル作成日時順に並べたい

Posted: 2005年7月24日(日) 17:26
by Sinryow
実験していないので何とも言えませんが
そのフォルダの中身をエクスプローラで「アイコンの整列」→「更新日時」で並び替えてからプログラムを実行したら,日時順に並びます?

もしそれができるのなら,制御できるかもしれません。

Re: リストボックスにファイル作成日時順に並べたい

Posted: 2005年7月24日(日) 17:37
by Mario2
> そのフォルダの中身をエクスプローラで「アイコンの整列」→「更新日時」で並び替えてからプログラムを実行したら,日時順に並びます?

回答ありがとうございます。
そうなったらうれしいのですが、残念ながら並ばずに「a..zあ..ん」のあいうえお順のままです。

Re: リストボックスにファイル作成日時順に並べたい

Posted: 2005年7月25日(月) 06:37
by 通りすがり
> 以下のようなものを使って、ListBoxに項目を追加しています。
> 説明が分かりにくいかもしれませんが、よろしくお願いします。

1)元データ(+更新日情報)を別途保持して、更新日順にソートして、ソート終了時にリストボックスを更新、または

2)リストビュー(多列のリストボックスのようなもの)を利用して、更新日でソートをかける(昔databaoxと言うAB3.0用のリストビューソフトを見たような...)

Re: リストボックスにファイル作成日時順に並べたい

Posted: 2005年7月25日(月) 11:15
by Sinryow
ファイル名から,64ビットのファイル時間を返す関数を作ってみました。参考にどうぞ。
GetFileTime関数,FILETIME構造体のヘルプを参照して下さい。

コード: 全て選択

Const TIME_CREATED		= 0		' 作成された日時
Const TIME_ACCESSED		= 1		' 最後にアクセスされた日時
Const TIME_WROTE		= 2		' 最後に更新された日時

Function FileTime(szFileName As String, nMode As Long) As Int64
	Dim hFile As HANDLE, FT[2] As FILETIME, temp As Int64

	hFile=CreateFile(szFileName, GENERIC_READ, 0, ByVal NULL, OPEN_EXISTING, 0, NULL)
	If hFile=INVALID_HANDLE_VALUE Then
		FileTime=0
		Exit Function
	End If

	If GetFileTime(hFile, FT[0], FT[1], FT[2])=FALSE Then
		FileTime=0
		Exit Function
	End If
	
	CloseHandle(hFile)
	temp=FT[nMode].dwHighDateTime
	FileTime=(temp<<32 Or FT[nMode].dwLowDateTime)
End Function

'使用例
Dim tm As Int64
tm=FileTime("ProjectEditor.exe", TIME_CREATED)

Re: リストボックスにファイル作成日時順に並べたい

Posted: 2005年7月25日(月) 12:08
by Mario2
> ファイル名から,64ビットのファイル時間を返す関数を作ってみました。参考にどうぞ。

ありがとうございます。参考にして、がんばってみます。

Re: リストボックスにファイル作成日時順に並べたい

Posted: 2005年7月25日(月) 12:53
by Mario2
それと、
>GetTime関数
ではなく、GetTimeFormat関数だと思うのですが、違いますか?

Re: リストボックスにファイル作成日時順に並べたい

Posted: 2005年7月25日(月) 17:41
by Sinryow
> それと、
> >GetTime関数
> ではなく、GetTimeFormat関数だと思うのですが、違いますか?

間違えていました。GetTimeではなくGetFileTimeでした。(直しておきました。)

なお,GetTimeFormatは,SYSTEMTIME(システム時間のデータ)を文字列に直す関数ですのでここでは関係ありません。
(もちろん,私の作成したFileTime関数の値から,ウィンドウに表示するための文字列を得るのには使うかもしれませんが。)

Posted: 2005年7月25日(月) 21:49
by イグトランス
ところでWIN32_FIND_DATAのメンバにもFILETIMEがありますよ。
これを使っても出来るのではないでしょうか?

Posted: 2005年7月26日(火) 02:28
by Mario2
みなさん、ありがとうございます。無事、したかったこと(作成日時順に並び替える)が実現しました。

ありがとうございました。