|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
|||
|
|||
Хранение графических файлов (jpeg) в переменной
Добрый день. Есть следующая ситуация :
- программа по УРЛ загружает множество картинок с сайтов записывает их в указанный каталог на ЖД под своими собственными именами. все очень наглядно, можно просмотреть, если нужно, картинки - на текущем этапе уже не нужно просматривать картинки, и значит не нужно записывать их на ЖД. лучше сразу в ГлобПерем. Вопрос : какого типа нужно использовать переменную, учитывая что : - файлы графические(бинарные?) - размер файла от 1 до 1000 кб - число файлов - тысячи - общий объем загрузки может состовлять ?сотни мегабайт - желательно чтобы метод был универсальный(веб-страницы то же чтоб можно было сохранять) - не было потенциальной возможности сбоя(из за типа переменной) при хранении данных в ОЗУ |
#2
|
||||
|
||||
Хранить файлы в переменных невозможно. Переменная хранит обычно от 1 до 4 байт.
Пишу программы за еду. __________________ Последний раз редактировалось NumLock, 05.03.2017 в 20:14. |
#3
|
|||
|
|||
TStringList ну пускай объект-класс. не надо придираться по мелочам
|
#4
|
||||
|
||||
А почему не TList<TJPEGImage> ?
Пишу программы за еду. __________________ |
#5
|
||||
|
||||
Цитата:
Код:
uses UrlMon; procedure TForm1.Button1Click(Sender: TObject); var URLfile, Fname: string; begin // "УРЛ...картинки" URLfile:= 'http://kaifolog.ru/uploads/posts/2011-10/1319535258_002.jpg'; // "указанный каталог" Fname:= ExtractFilePath(ParamStr(0)) + // "под своими собственными именами" Copy(URLfile,LastDelimiter('/',URLfile)+1,Length(URLfile)); // "можно просмотреть...картинки" если уже есть на диске if FileExists(Fname) then Image1.Picture.LoadFromFile(Fname) else // или "записывает их в указанный каталог на ЖД" UrlDownloadToFile(nil,PAnsiChar(URLfile),PAnsiChar(Fname),0,nil); end; Я не понял Вашего вопроса, но всё же Вам на него отвечу! |
#6
|
|||
|
|||
Alegun, спасибо за внимание, но
Цитата:
еще раз, прям сейчас : - многопоточные загрузчики, под управление диспетчера потоков, грузят в указанный каталог на ЖД графические файлы разных типов и размеров - по окончании загрузки имена файлов записываются в список ТСтрингЛист - в цикле ДЛЯ файлы вызываются по имени и анализируются по указанным параметрам (размер файла, тип файла, ширина-высота файла) и ИМЕНА файлов сортируются в списке по правилам - файл с первым именем в списке(с самым большим индексом) вызывается, обрабатывается и сохраняется в другом каталоге с другим именем - в первом каталоге все файлы удаляются Следующий цикл загрузки картинок, и так тыщи циклов мне не нравится первый пункт, запись файлов на ЖД. оно совершенно не нужно. вопрос в какой потомок ТСтрингс(или куда еще) и как записать множество самых разных типов файлов. но только не надо догадки тут постить. если нет реального опыта, писать не надо. |
#7
|
|||
|
|||
Например, сохранять не в файл, а в TMemoryStream. Только тип файла надо хранить где-нибудь в другом месте.
|
#8
|
|||
|
|||
Ну а классы и дженерики тебе нафига даны.
Код:
interface type TMemDataType = (mdtJpeg, mdtHtml); TMemData = class private FDataType : TMemDataType; FData : TStream; public constructor Create(ADataType : TDataType; AData : TStream); property DataType : TDataType read FDataType; property Data : TStream read FData; end; // Если нужно что-то специфичное, то "рожаем" наследников TJpegMemData = class(TMemData) private FWidth : Integer; FHeight : Integer; public constructor Create(AData : TStream; AWidth, AHeight : Integer); property Width : Integer read FWidth; property Height : Integer read FHeight; end; // А тут список для хранения всего этого счастья var LoadedData : TObjectList<TMemData>; implementation constructor TMemData.Create(ADataType : TDataType; AData : TStream); begin inherited; FDataType := ADataType; FData := AData; end; constructor TJpegMemData.Create(AData : TStream; AWidth, AHeight : Integer); begin inherited Create(mdtJpeg,AData); FWidth := AWidth; FHeight := AHeight; end; // Создание и удаление глобального списка initialization LoadedData := TObjectList<TMemData>.Create; finallization FreeAndNil(LoadedData); end. Как то так. Только не забыть при работе со списком обеспечить потокозащищенность. ЗЫ. А вообще зачем хранить все в памяти, если потом идет обработка и удаление лишнего и сохранение только полезного. Может проще просто прямо в потоке проанализировать и не сохранять ничего лишнего? |
#9
|
|||
|
|||
Цитата:
Наверно потому что загрузка картинок многопоточная и ассинхронная. вначале нужно загрузить ВСЕ картинки и только потом их анализировать. вот именно для этого их нужно где то хранить. пока на ЖД. но чтобы не пилить ЖД(и ССД тоже не любят лишние циклы записи) и нужно НАКАПЛИВАТЬ граф.файлы в ОЗУ. ну теперь то уже все понятно? |
#10
|
||||
|
||||
Цитата:
Я не понял Вашего вопроса, но всё же Вам на него отвечу! |