Дельфи как узнать размер файла

Обновлено: 06.07.2024

Я хочу знать ширину и высоту файла изображения перед тем, как открыть этот файл.

Итак, как это сделать?

EDIT:
Это относится к файлам изображений jpg, bmp, png и gif.

спросил(а) 2021-01-13T17:04:49+03:00 10 месяцев, 1 неделя назад

Вы можете попробовать Эта страница. Я не тестировал его, но кажется довольно разумным, что он будет работать.

Кроме того, разные типы файлов имеют разные способы получения ширины и высоты. Постарайтесь быть более конкретными в своем вопросе.

Одна из страниц anwser:

И для BMP (также на странице, о которой я упоминал):

ответил(а) 2021-01-13T17:04:49+03:00 10 месяцев, 1 неделя назад

Если по "файлу изображения" вы имеете в виду те файлы растровых изображений, которые распознаются графической системой VCL, а "перед открытием" вы имеете в виду "прежде чем пользователь может заметить, что файл открыт", то вы можете сделать это очень легко:

Конечно, файл открывается, и для этого требуется большая память, если изображение большое. Однако, если вам нужно получить metatada (например, размеры) без загрузки файла, я считаю, что вам нужно более "сложное" решение.

ответил(а) 2021-01-13T17:04:49+03:00 10 месяцев, 1 неделя назад

В качестве дополнения к Rafael answer, я считаю, что эта более короткая процедура может определять размеры BMP:

ответил(а) 2021-01-13T17:04:49+03:00 10 месяцев, 1 неделя назад

Посмотрите на exiftool.exe. Это бесплатно. Это стандарт для такого рода вещей, но вам придется выкладываться.

ответил(а) 2021-01-13T17:04:49+03:00 10 месяцев, 1 неделя назад

Если кто-либо еще заинтересован в получении размеров изображения TIFF без загрузки графического объекта, существует проверенный метод, который отлично работает для меня во всех средах. Я также нашел другое решение для этого, но он вернул неверные значения из TIFF, созданных Illustrator. Но есть фантастическая графическая библиотека, называемая GraphicEx от Майка Лишке (TVirtualStringTree очень талантливый разработчик). Существуют реализации многих популярных форматов изображений, и все они происходят из базового класса TGraphicExGraphic, который реализует виртуальный метод ReadImageProperties. Он основан на потоках и только считывает файл файл во всех реализациях. Так что молниеносно. -)

Итак, вот пример кода, который извлекает размеры TIFF (метод одинаковый для всех графических реализаций, PNG, PCD, TGA, GIF, PCX и т.д.):

Передо мной никогда не стояла задача определения размера файла Delphi. Но после того как где-то увидел вопрос: "как определить размер файла", мне тоже стало интересно.

  1. Задаём тип данных размером 1 байт. Это будет запись.
  2. Определяем файловую переменную этого типа.
  3. Начинаем с начала файла и переходим к концу. Сколько переходов - столько и байтов в файле!

procedure TForm1.ButtonClick(Sender: TObject);
type TSize = Record
Bait: byte;
end;
var F: File of TSize;
Size: Integer;
begin
Size:=0;
with OpenDialog1 do
if Execute then
begin
AssignFile(F, FileName);
Reset(F);
while (not EOF(F)) do
begin
Size:=Size+1;
seek(F, Size);
end;
Form1.Caption:=IntToStr(Size); // Выводим информацию о размере в заголовок Формы
CloseFile(F);
end;
end;

Программа была написана за пять минут, что называется, "на коленке". Она работает, и для файлов размером до нескольких мегабайт время ожидания результата невелико, несколько секунд. Для больших файлов ожидание затягивается, и программа выглядит "зависшей". Можно изменить программу так, чтобы она считала килобайты (заменить seek(F, Size) на seek(F, Size*1024) ). Скорость работы возрастёт в 1024 раза, и уже будет приемлемой.

Это была ещё одна демонстрация приёмов работы с файлами. А на самом деле всё гораздо проще! Размер файла возвращается встроенной функцией FileSize. А файл достаточно описать как имеющий тип byte:

procedure TForm1.ButtonClick(Sender: TObject);
var F: File of byte;
Size: Integer;
begin
with OpenDialog1 do
if Execute then
begin
AssignFile(F, FileName);
Reset(F);
Size:=Filesize(F);
Form1.Caption:=IntToStr(Size); // Выводим информацию о размере в заголовок Формы
CloseFile(F);
end;
end;

Есть альтернативный способ работы с файлами Delphi, в котором файл рассматривается как объект. Там также есть встроенные способы определения размера файла. Также приведу процедуру целиком:

procedure TForm1.ButtonClick(Sender: TObject);
var F: TFileStream;
begin
with OpenDialog1 do
if Execute then
begin
F:=TFileStream.Create(Filename, fmOpenRead);
Caption:=IntToStr(F.Size);
F.Free;
end;
end;

Эта процедура выглядит компактнее, работает быстрее, но и требует дополнительной подготовки.

Как в Delphi 2010 можно узнать размер файла? Нужно ли мне возвращаться и использовать FindFirst для доступа к TSearchRec.FindData ?

Я собрал это преобразование этой процедуры в Delphi (и в процессе модифицировал его для обработки файлов размером> 4 ГБ, если вам это нужно).

На самом деле вы можете просто использовать GetFileSize () , но для этого требуется HANDLE файла, а не только имя файла, и, как и в предложении GetCompressedFileSize () , для этого требуются две переменные для вызова . И GetFileSize () , и GetCompressedFileSize () перегружают свое возвращаемое значение, поэтому проверка успешности и обеспечение действительного результата немного сложнее.

GetFileSize Ex () позволяет избежать мельчайших деталей обработки файлов размером> 4 ГБ и определения правильных результатов, но также требует HANDLE файла, а не имени, и (как в Delphi По крайней мере, 2009 год, я не проверял 2010 год), нигде не объявлено для вас в VCL, вам придется предоставить собственное объявление импорта.

Вы также можете использовать DSiFileSize из DSiWin32. Работает во "всем" Delphis. Внутри он вызывает CreateFile и GetFileSize.

Я хотел бы упомянуть несколько способов на чистом Delphi . Хотя я думаю, что Deltics дала наиболее быстрый ответ для платформы Windows , но иногда вам нужно просто положиться на RTL, а также создать переносимый код, который будет работать в Delphi для MacOS или в FreePascal / Virtual Pascal / что угодно .

Со времен Turbo Pascal осталась функция FileSize .

В приведенном выше примере отсутствует настройка режима «только чтение». Это потребуется для открытия файла r / o, например, на носителе CD-ROM или в папке с ACL, установленным на r / o. Перед вызовом ReSet глобальной переменной FileMode должен быть присвоен ноль.

Он не будет работать с файлами размером более 2 ГБ (возможно, с отрицательным преобразованием в кардинальное - до 4 ГБ), но является "из коробки".

Есть еще один подход, который вам может быть знаком, если вы когда-либо занимались программированием ASM для MS-DOS. Вы Seek указываете файл на 1-й байт, затем на последний байт и проверяете разницу.
Я не могу точно сказать, какая версия Delphi представила их, но я думаю, что это уже было в какой-то древней версии, такой как D5 или D7, хотя это просто здравый смысл, и я не могу его проверить.
Это потребует дополнительной переменной THandle и блока try-finally , чтобы всегда закрывать дескриптор после получения размера.

Помимо первого подхода, это поддерживает int64. Он также совместим с FreePascal, хотя и с некоторыми ограничениями.

Вы также можете создавать и использовать TFileStream - типизированный объект, который был основным , официально признанным каналом для файловых операций с Delphi 1.0

В качестве примечания, этот проспект, конечно, интегрирован с вышеупомянутым блоком IOUtils .

Читайте также: