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

ActiveBasicでのプログラミングでわからないこと、困ったことなどがあったら、ここで質問してみましょう(質問を行う場合は、過去ログやWeb上であらかじめ問題を整理するようにしましょう☆)。
返信する
メッセージ
作成者
Mario2
記事: 205
登録日時: 2005年5月31日(火) 13:31
お住まい: 大阪市
連絡する:

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

#1 投稿記事 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の作成日
 (新しい)  >  (古い)


説明が分かりにくいかもしれませんが、よろしくお願いします。
Sinryow
記事: 141
登録日時: 2005年5月31日(火) 09:34
お住まい: 北海道
連絡する:

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

#2 投稿記事 by Sinryow »

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

もしそれができるのなら,制御できるかもしれません。
' ============================================================
' Sinryow Game Home Page - http://www.sinryow.net/
' Sinryow ActiveBasic Center - http://ab.sinryow.net/
' ============================================================
Mario2
記事: 205
登録日時: 2005年5月31日(火) 13:31
お住まい: 大阪市
連絡する:

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

#3 投稿記事 by Mario2 »

> そのフォルダの中身をエクスプローラで「アイコンの整列」→「更新日時」で並び替えてからプログラムを実行したら,日時順に並びます?

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

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

#4 投稿記事 by 通りすがり »

> 以下のようなものを使って、ListBoxに項目を追加しています。
> 説明が分かりにくいかもしれませんが、よろしくお願いします。

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

2)リストビュー(多列のリストボックスのようなもの)を利用して、更新日でソートをかける(昔databaoxと言うAB3.0用のリストビューソフトを見たような...)
Sinryow
記事: 141
登録日時: 2005年5月31日(火) 09:34
お住まい: 北海道
連絡する:

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

#5 投稿記事 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)
最後に編集したユーザー Sinryow [ 2005年7月25日(月) 17:43 ], 累計 1 回
' ============================================================
' Sinryow Game Home Page - http://www.sinryow.net/
' Sinryow ActiveBasic Center - http://ab.sinryow.net/
' ============================================================
Mario2
記事: 205
登録日時: 2005年5月31日(火) 13:31
お住まい: 大阪市
連絡する:

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

#6 投稿記事 by Mario2 »

> ファイル名から,64ビットのファイル時間を返す関数を作ってみました。参考にどうぞ。

ありがとうございます。参考にして、がんばってみます。
Mario2
記事: 205
登録日時: 2005年5月31日(火) 13:31
お住まい: 大阪市
連絡する:

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

#7 投稿記事 by Mario2 »

それと、
>GetTime関数
ではなく、GetTimeFormat関数だと思うのですが、違いますか?
Sinryow
記事: 141
登録日時: 2005年5月31日(火) 09:34
お住まい: 北海道
連絡する:

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

#8 投稿記事 by Sinryow »

> それと、
> >GetTime関数
> ではなく、GetTimeFormat関数だと思うのですが、違いますか?

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

なお,GetTimeFormatは,SYSTEMTIME(システム時間のデータ)を文字列に直す関数ですのでここでは関係ありません。
(もちろん,私の作成したFileTime関数の値から,ウィンドウに表示するための文字列を得るのには使うかもしれませんが。)
' ============================================================
' Sinryow Game Home Page - http://www.sinryow.net/
' Sinryow ActiveBasic Center - http://ab.sinryow.net/
' ============================================================
イグトランス
記事: 899
登録日時: 2005年5月31日(火) 17:59
お住まい: 東京都
連絡する:

#9 投稿記事 by イグトランス »

ところでWIN32_FIND_DATAのメンバにもFILETIMEがありますよ。
これを使っても出来るのではないでしょうか?
Mario2
記事: 205
登録日時: 2005年5月31日(火) 13:31
お住まい: 大阪市
連絡する:

#10 投稿記事 by Mario2 »

みなさん、ありがとうございます。無事、したかったこと(作成日時順に並び替える)が実現しました。

ありがとうございました。
返信する