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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 09.08.2015, 15:43   #1
Михаил Юрьевич
Форумчанин
 
Аватар для Михаил Юрьевич
 
Регистрация: 25.12.2007
Сообщений: 655
По умолчанию Размер файлов

Подскажите как получить размер загруженных в ListView файлов, тех которые отмечены чикетом.
Через функцию GetFileSize узнаю размер одного файла, а как всех загруженных?

Код:
with sListView2 do begin
 for i:=0 to Items.Count-1 do
  if Items[i].Checked then
   sz:=IntToStr(GetFileSize(sListView2.Items[i].Caption))
   end;
За частые поиски был забанен во всех известных
поисковых системах!
Михаил Юрьевич вне форума Ответить с цитированием
Старый 09.08.2015, 15:57   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

А тот код, который у тебя разве этого не делает?
Разве что написать sz:=sz+...

Покажи код выяснения размера одного файла.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 09.08.2015, 16:26   #3
Михаил Юрьевич
Форумчанин
 
Аватар для Михаил Юрьевич
 
Регистрация: 25.12.2007
Сообщений: 655
По умолчанию

Спасибо большое, просто не сплюсовал

Код:
 function GetFileSize(FileName: string): Integer;
var
FS: TFilestream;
begin
try
FS := TFilestream.Create(Filename, fmShareDenyRead);
except
Result := -1;
end;
if Result <> -1 then
Result := FS.Size;
FS.Free;
end;
За частые поиски был забанен во всех известных
поисковых системах!

Последний раз редактировалось Stilet; 09.08.2015 в 17:24.
Михаил Юрьевич вне форума Ответить с цитированием
Старый 09.08.2015, 17:24   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Ну бывает )
Кстати, ты бы свою функцию назвал бы по другому. Такое имя кажись в Win API уже есть.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 09.08.2015, 19:14   #5
ResourceSpace
Форумчанин
 
Аватар для ResourceSpace
 
Регистрация: 30.06.2015
Сообщений: 353
По умолчанию

Size это Int64. Функция должна возвращать Int64. Ну и sz тоже Int64.
ResourceSpace вне форума Ответить с цитированием
Старый 09.08.2015, 23:09   #6
3D Hunter
Сумрачная тень
Форумчанин
 
Аватар для 3D Hunter
 
Регистрация: 05.03.2009
Сообщений: 689
По умолчанию

Размер файла правильнее будет брать так:
Код:
function GetFileSizeEx(AhFile:THandle;
                       ApFileSize:PLargeInteger):BOOL;
         stdcall;
         external kernel32 name 'GetFileSizeEx';

//возвращает размер файла AFileName в байтах
//(в случае ошибки вернет -1 и запишет описание ошибки в AErrorDesc)
function GetFS(const AFileName:string;
               out AErrorDesc:string):Int64;
var
  LhFile:THandle;
begin
  //начальный результат
  Result:=-1;

  //открываем файл
  LhFile:=CreateFile(PChar(AFileName),GENERIC_READ,FILE_SHARE_READ,nil,OPEN_EXISTING,0,0);

  //если ошибка при открытии
  if (LhFile=INVALID_HANDLE_VALUE) then
    begin
      //формируем описание ошибки
      AErrorDesc:=SysErrorMessage(GetLastError);

      //выходим
      Exit;
    end;

  try
    //если не удалось взять размер файла
    if (not GetFileSizeEx(LhFile,@Result)) then
      begin
        //формируем описание ошибки
        AErrorDesc:=SysErrorMessage(GetLastError);

        //выходим
        Exit;
      end;
  finally
    //закрываем файл
    CloseHandle(LhFile);
  end;
end;


//пример использования
procedure TForm2.FormCreate(Sender: TObject);
var
  LSize:Int64;
  LErrorDesc:string;
begin
  LSize:=GetFS('<ПОЛНОЕ ИМЯ ФАЙЛА>',
               LErrorDesc);
  if (LSize=-1) then
    Caption:=LErrorDesc
  else
    Caption:=IntToStr(LSize);
end;
"ковыряю изнутри" (с)
3D Hunter вне форума Ответить с цитированием
Старый 10.08.2015, 11:24   #7
eoln
Старожил
 
Аватар для eoln
 
Регистрация: 26.04.2008
Сообщений: 2,645
По умолчанию

Ещё как вариант
Код:
var
    ff: _WIN32_FIND_DATA;//_WIN32_FIND_DATAA
    hFind: hwnd;
...
hFind := FindFirstfile('путь_имя', ff);
showmessage(inttostr(ff.nFileSizeHigh shl 32 + ff.nFileSizeLow));
FindClose(hFind)
Можно подстраховаться и явно указать тип int64. Раньше с этим проблемы были, сейчас - наверное, тоже
Код:
var  
  c:int64;
...
  hFind := FindFirstFile('путь_имя',ff);
  c := int64(ff.nFileSizeLow) or (int64(ff.nFileSizeHigh) shl 32);

  FindClose(hFind)
Ну и плюс проверки на ошибки

Последний раз редактировалось eoln; 10.08.2015 в 15:50.
eoln вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Почему уменьшился максимальный размер загружаемых файлов? Вадим Мошев О форуме и сайтах клуба 1 03.08.2013 22:51
Удаление файлов из папки по условию (размер) Vasьka Microsoft Office Excel 3 10.07.2013 21:38
BMP, JPG скриншоты экрана. Большой размер файлов даже с использованием компрессии. Человек_Борща Общие вопросы Delphi 4 05.04.2010 19:10
поиск дубликатов файлов(имя, тип, размер). Вывод дубликатов на экран с отображением их пути faraon1792 Помощь студентам 4 19.03.2010 23:46
Как узнать число файлов и их суммарный размер в указанной папке? 3D Hunter Общие вопросы Delphi 3 11.11.2009 16:26