Einzelnen Beitrag anzeigen

Nic2012

Registriert seit: 2. Mai 2012
62 Beiträge
 
#1

Falsche Dateigröße über SHGetDataFromIDList

  Alt 4. Mär 2013, 15:06
Hi,
mit dem alten VListView Demo aus D7 ist es mir gelungen die Flash-Karte einer eingebundenen Digitalkamera auszulesen. Die Flash-Karte ist aber nur als PTP-Laufwerk ohne LW-Buchstabe im Betriebssystem eingebunden.

Trotzdem zeigt mir die alte Demo via ShellAPI die Verzeichnisstruktur und listet alle Bilder der Karte auf. Allerdings bleibt die Dateigröße immer bei 0 kb. Ursächliche Methode SHGetDataFromIDList.
Ich verwende D7 auf Win7,x64.

Bei den logischen LW funktion. das aber. Woran liegt es ?

Hier der Code Block:
Code:
procedure TForm1.CheckShellItems(StartIndex, EndIndex: Integer);

 function ValidFileTime(FileTime: TFileTime): Boolean;
 begin
   Result := (FileTime.dwLowDateTime <> 0) or (FileTime.dwHighDateTime <> 0);
 end;

var
  FileData: TWin32FindData;
  FileInfo: TSHFileInfo;
  SysTime: TSystemTime;
  I: Integer;
  LocalFileTime: TFILETIME;
  c : Cardinal;
begin
  //Here all the data that wasn't initialized in PopulateIDList is
  //filled in.
  for I := StartIndex to EndIndex do
  begin
    if ShellItem(I)^.Empty then
    with ShellItem(I)^ do
    begin
      FullID := ConcatPIDLs(FPIDL, ID);
      ImageIndex := GetShellImage(FullID, ListView.ViewStyle = vsIcon, False);

      //File Type
      SHGetFileInfo(
        PChar(FullID),
        0,
        FileInfo,
        SizeOf(FileInfo),
        SHGFI_TYPENAME or SHGFI_PIDL
      );
      TypeName := FileInfo.szTypeName;

      //Get File info from Windows
      FillChar(FileData, SizeOf(FileData), #0);
      [B]SHGetDataFromIDList[/B](
        FIShellFolder,
        ID,
        SHGDFIL_FINDDATA,
        @FileData,
        SizeOf(FileData)
      );

      //File Size, in KB
      Size := (FileData.nFileSizeLow + 1023 ) div 1024;
      if Size = 0 then Size := 1;

      c := FileData.nFileSizeHigh;

      //Modified Date
      FillChar(LocalFileTime, SizeOf(TFileTime), #0);
      with FileData do
        if ValidFileTime(ftLastWriteTime)
        and FileTimeToLocalFileTime(ftLastWriteTime, LocalFileTime)
        and FileTimeToSystemTime(LocalFileTime, SysTime) then
        try
          ModDate := DateTimeToStr(SystemTimeToDateTime(SysTime))
        except
          on EConvertError do ModDate := '';
        end
        else
          ModDate := '';

      //Attributes
      Attributes := FileData.dwFileAttributes;

      //Flag this record as complete.
      Empty := False;
    end;
  end;
end;
  Mit Zitat antworten Zitat