2

フォルダーのpidlがあります(存在するか、削除されている可能性があります)。

IShellItem次のコードで取得できますが、必要なのはそのフォルダーの作成日を取得することです。で取得できると思いますがPKEY_DateCreated、方法がわかりません。

SHCreateShellItem(nil, nil, pidl, ShellItem);

これを行うにはどうすればよいですか?

デルファイを使用しています。

4

3 に答える 3

2

PIDL がある場合は、SHGetDataFromIDListを使用してオブジェクトの基本属性を取得できます。IShellItem(または)はまったく必要ありませんIShellItem2nFormatパラメーターにSHGDFIL_FINDDATAを指定します ( SHGetDataFromIDListを参照)。 詳細については)。

これの良いところは、標準のファイルシステム オブジェクトの場合、メタデータが PIDL 自体にエンコードされているため、オブジェクトが存在しなくなった場合でも、関数は有用なデータを返すことです。

于 2013-03-04T10:58:43.213 に答える
2

純粋な 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));
于 2013-03-02T21:31:49.560 に答える
2

作成日の取得

IShellItem2 の使用

IShellItem2IShellItemプロパティ システムから型指定されたプロパティを取得するための多くのヘルパー メソッドを追加することによって拡張されます。

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]IPropertyStorePKEY_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);
于 2019-05-11T02:26:51.620 に答える