フォルダーのpidlがあります(存在するか、削除されている可能性があります)。
IShellItem
次のコードで取得できますが、必要なのはそのフォルダーの作成日を取得することです。で取得できると思いますがPKEY_DateCreated
、方法がわかりません。
SHCreateShellItem(nil, nil, pidl, ShellItem);
これを行うにはどうすればよいですか?
デルファイを使用しています。
フォルダーのpidlがあります(存在するか、削除されている可能性があります)。
IShellItem
次のコードで取得できますが、必要なのはそのフォルダーの作成日を取得することです。で取得できると思いますがPKEY_DateCreated
、方法がわかりません。
SHCreateShellItem(nil, nil, pidl, ShellItem);
これを行うにはどうすればよいですか?
デルファイを使用しています。
PIDL がある場合は、SHGetDataFromIDListを使用してオブジェクトの基本属性を取得できます。IShellItem
(または)はまったく必要ありませんIShellItem2
。nFormatパラメーターにSHGDFIL_FINDDATAを指定します ( SHGetDataFromIDListを参照)。
詳細については)。
これの良いところは、標準のファイルシステム オブジェクトの場合、メタデータが PIDL 自体にエンコードされているため、オブジェクトが存在しなくなった場合でも、関数は有用なデータを返すことです。
純粋な Winapi の例:
IShellItem2* pItem2 = NULL;
hr = pItem->QueryInterface(&pItem2);
if (SUCCEEDED(hr))
{
FILETIME ft = {0};
pItem2->GetFileTime(PKEY_DateCreated, &ft);
SYSTEMTIME st = {0};
::FileTimeToSystemTime(&ft, &st);
wprintf(
L"Date Created: %04d-%02d-%02d %02d:%02d:%02d\n",
st.wYear, st.wMonth, st.wDay, st.wHour, st.wMinute, st.wSecond);
pItem2->Release();
}
また、David Heffernan が指摘したように、すべてのシェルアイテムに作成日があると確信していますか?
Delphi に変換すると、次のようになります。
var
Item: IShellItem;
Item2: IShellItem2;
ft: TFileTime;
st: TSystemTime;
....
Item2 := Item as IShellItem2;
OleCheck(Item2.GetFileTime(PKEY_DateCreated, ft));
Win32Check(FileTimeToSystemTime(ft, st));
IShellItem2 の使用
IShellItem2
IShellItem
プロパティ システムから型指定されたプロパティを取得するための多くのヘルパー メソッドを追加することによって拡張されます。
var
ft: FILETIME;
createdDate: TDateTime;
// IShellItem2 provides many handy helper methods to IShellItem
(shellItem as IShellItem2).GetFileTime(PKEY_DateCreated, {out}ft);
createdDate := FileTimeToDateTime(ft);
IShellItem の使用
Windows Vista Windows XP 1が追加され、 +が 1 つのオブジェクトにIShellItem
まとめられました。Windows Vista では、プロパティの豊富なシステムが追加されました。 はプロパティのキーと値のペアのセットです ( を含む):[IShellFolder]
[ITEMID_CHILD]
IPropertyStore
PKEY_DateCreated
var
ps: IPropertyStore;
pv: TPropVariant;
ft: FILETIME;
createdDate: TDateTime;
//Get the IPropertyStore yourself, in order to read the property you want
shellItem.BindToHandler(nil, BHID_PropertyStore, IPropertyStore, {out}ps);
ps.GetValue(PKEY_DateCreated, {out}pv);
PropVariantToFileTime(pv, PSTF_UTC, {out}ft);
createdDate := FileTimeToDateTime(ft);
IShellFolder の使用
IShellFolder
オリジナルの Windows 95 インターフェイスです。フォルダのみを表し、そのフォルダ内のアイテム ( ) について尋ねる必要がありITEMID_CHILD
ます。プロパティ システムは VistaまでPKEY_DateCreated
存在しなかったため、Vista の前にはありませんでした。ただし、ファイルとフォルダーにはまだCreationTimeがありました
var
folder: IShellFolder;
parent: PIDLIST_ABSOLUTE;
child: PITEMID_CHILD;
findData: WIN32_FIND_DATA;
// We have an IShellItem that represents IShellFolder+ChildItemID.
// Ask the IShellItem to cough up its IShellFolder and child pidl
(shellItem as IParentAndItem).GetParentAndItem(parent, folder, child);
// Get the WIN32_FIND_DATA information associated with the child file/folder
SHGetDataFromIDList(folder, child, SHGDFIL_FINDDATA, findData, sizeof(findData));
createdDate := FileTimeToDateTime(findData.ftCreationTime);