Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 12.03.2011, 14:39   #1
MeTeOpA
Форумчанин
 
Аватар для MeTeOpA
 
Регистрация: 17.02.2010
Сообщений: 194
По умолчанию Вопрос об FileSize

Добрый день ув.программисты.

Программа для поиска одинаковых файлов на диске.

Проблема состоит в том что не удается присвоить 2ому столбцу размеры найденных файлов.

Код:
procedure TForm1.Button1Click(Sender: TObject);
var sr:TSearchRec;
Result:word;
i:integer;
Dir:string;
begin
i:=1;
SG1.Cells[0,0]:='Название Файла';
SG1.Cells[1,0]:='Размер';
SG1.Cells[2,0]:='Дата';
Dir:='C:\';
Result := FindFirst (Dir+'*.*',faAnyFile,sr);
While result=0 do
Begin
Result:=FindNext (sr);

SG1.Cells[0,i]:=sr.name;
//SG1.Cells[1,i]:=IntToStr(FileSize(Dir+sr.name)); Вот здесь проблема
SG1.Cells[2,i]:=DateTostr(FileDateToDateTime(SR.Time));
i:=i+1;
SG1.RowCount:=SG1.RowCount+1;
End;
end;

end.
PS проект залить не удалось... Помогите кто чем может
MeTeOpA вне форума Ответить с цитированием
Старый 12.03.2011, 14:50   #2
ArtGrek
DelphiProger
Участник клуба
 
Аватар для ArtGrek
 
Регистрация: 14.11.2010
Сообщений: 1,023
По умолчанию

в баитах
Код:
SG1.Cells[1,i]:=IntToStr(sr.Size);
FileSize работает после Assigne и всего такого
VirusN13
ArtGrek вне форума Ответить с цитированием
Старый 12.03.2011, 20:06   #3
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

ArtGrek +1

только надо учесть, что это будет корректно работать, только если размер файла меньше 4 Гб.
Если возможны файлы большего размера, то тогда надо получать размер чуть по другому..
смотрите пост тут
Serge_Bliznykov вне форума Ответить с цитированием
Старый 14.03.2011, 17:03   #4
MeTeOpA
Форумчанин
 
Аватар для MeTeOpA
 
Регистрация: 17.02.2010
Сообщений: 194
По умолчанию

спасибо, работает а есть процедура для того чтобы размер отображался не в байтах а в зависимости от размера в кб,мб,гб?
MeTeOpA вне форума Ответить с цитированием
Старый 14.03.2011, 18:03   #5
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

Код:
function niceFileSize(fs: int64): string;
begin
  if (fs < 0) then
    result := 'а у вас файло убежало'
  else
  if (fs = 1) then
    result := '1 byte'
  else
  if (fs < 1024) then
    result := IntToStr(fs) + ' bytes'
  else
  if (fs < 1024 * 1024) then
    result := IntToStr(fs shr 10) + ' KB'
  else
  if (fs < 1024 * 1024 * 1024) then
    result := IntToStr(fs shr 20) + ' MB'
  else
  if (fs < int64(1024) * 1024 * 1024 * 1024) then
    result := IntToStr(fs shr 30) + ' GB'
  else
    result := IntToStr(fs shr 40) + ' TB';
end;
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."

Последний раз редактировалось Serge_Bliznykov; 14.03.2011 в 18:45.
veniside вне форума Ответить с цитированием
Старый 14.03.2011, 22:45   #6
GunSmoker
Старожил
 
Регистрация: 13.08.2009
Сообщений: 2,581
По умолчанию

Я использую Shell-скую StrFormatByteSize:

Код:
var
  StrFormatByteSizeW: function(ASize: UInt64; szBuf: PWideChar; uiBufSize: UINT): PWideChar; stdcall;

function StrFormatByteSizeDummy(ASize: UInt64; szBuf: PWideChar; uiBufSize: UINT): PWideChar; stdcall;

  function FmtSizeToStr(const ASize: Int64): String;
  const
    _Kb: Int64 = 1024;
    _Mb: Int64 = 1024*1024;
    _Gb: Int64 = 1024*1024*1024;
    _Tb: Int64 = 1099511627776; // 1024*1024*1024*1024;
  begin
    if ASize < _Kb then
      Result := Format(rsELSzFmt, [IntToStr(ASize), rsELb])
    else
    if ASize < _Mb then
      Result := Format(rsELSzFmt, [FloatToStrF(ASize / _Kb, ffFixed, 18, 2), rsELKb])
    else
    if ASize < _Gb then
      Result := Format(rsELSzFmt, [FloatToStrF(ASize / _Mb, ffFixed, 18, 2), rsELMb])
    else
    if ASize < _Tb then
      Result := Format(rsELSzFmt, [FloatToStrF(ASize / _Gb, ffFixed, 18, 2), rsELGb])
    else
      Result := Format(rsELSzFmt, [FloatToStrF(ASize / _Tb, ffFixed, 18, 2), rsELTb]);
  end;

var
  Buf: WideString;
  Sz: Integer;
begin
  Buf := FmtSizeToStr(ASize);

  Sz := Min(Length(Buf) + 1, uiBufSize);
  if Sz > 0 then
  begin
    Move(Buf[1], szBuf^, Sz * SizeOf(WideChar));
    szBuf[uiBufSize - 1] := #0;
  end;
  Result := szBuf;
end;

function FmtFormatSize(const ASize: UInt64): String;
var
  Lib: HMODULE;
  Buf: WideString;
begin
  if not Assigned(StrFormatByteSizeW) then
  begin
    Lib := LoadLibrary(shlwapi);
    if Lib <> 0 then
    begin
      StrFormatByteSizeW := GetProcAddress(Lib, 'StrFormatByteSizeW'); // Do Not Localize
      if not Assigned(StrFormatByteSizeW) then
        StrFormatByteSizeW := StrFormatByteSizeDummy;
    end
    else
      StrFormatByteSizeW := StrFormatByteSizeDummy;
  end;

  SetLength(Buf, 1024);
  if StrFormatByteSizeW(ASize, PWideChar(Buf), Length(Buf)) = nil then
    StrFormatByteSizeDummy(ASize, PWideChar(Buf), Length(Buf));
  Result := PWideChar(Buf);
end;
StrFormatByteSizeDummy - это заглушка только для старых систем. Если это не надо, то можно существенно проще:
Код:
function StrFormatByteSizeW(ASize: UInt64; szBuf: PWideChar; uiBufSize: UINT): PWideChar; stdcall; external 'shlwapi.dll';

function FmtFormatSize(const ASize: UInt64): String;
var
  Buf: WideString;
begin
  SetLength(Buf, 1024);
  if StrFormatByteSizeW(ASize, PWideChar(Buf), Length(Buf)) <> nil then
    Result := PWideChar(Buf)
  else
    Result := UIntToStr(ASize);
end;
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
GunSmoker вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
filesize возвращает ноль, при не пустом файле legendary Общие вопросы Delphi 5 01.02.2011 19:32
Получение данных функцией FileSize Lokos Общие вопросы Delphi 9 23.12.2009 13:47
не работает FileSize Alex Cones Общие вопросы Delphi 2 11.12.2009 19:34
Вопрос наверное про функции, а так точно даже не знаю про что. (Вопрос начинющего #6) Albert2008 Общие вопросы Delphi 4 21.08.2008 15:33
вопрос по сокетам и общение как в ICQ.Сложный вопрос... Руслантус Общие вопросы C/C++ 2 12.08.2008 21:10