powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / VFP8. Как узнать размер файла в поле типа general ?
17 сообщений из 17, страница 1 из 1
VFP8. Как узнать размер файла в поле типа general ?
    #33051049
Dmitriy Sevastianov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
VFP8. Как узнать размер файла, который храниться в поле типа general ?
...
Рейтинг: 0 / 0
VFP8. Как узнать размер файла в поле типа general ?
    #33051737
Igor Korolyov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hi Dmitriy!

Никак. Равно как и нету простого универсального способа извлечения информации из этого поля - потому лучше использовать Memo binary для хранения файлов - если уж так хочется их в таблицу запихивать :)

Posted via ActualForum NNTP Server 1.1
...
Рейтинг: 0 / 0
VFP8. Как узнать размер файла в поле типа general ?
    #33053134
Crispy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Hi, Igor Korolyov !

>Никак. Равно как и нету простого универсального способа извлечения информации из этого поля - потому лучше использовать Memo binary для хранения файлов - если уж так хочется их в таблицу запихивать :)

Я где-то тоже читал про это. Но тут вдруг мне стало интересно - ну неужели же, в самом деле, никак нельзя? И вдруг оказалось:
Если очень хочется, то оказывается - можно!!!
И не так уж трудно.
Достаточно вооружиться HIEW и немного подумать, чтобы осуществить "реверсинг" FPT, в котором хранится General, средствами VFP. Я уже нашел, как и где хранится размер файла в поле General, и даже примерно понял - как "выковыривать" файл оттуда. Осталось доработать программку, чтобы сделать ее универсальной.


to Dmitriy Sevastianov :

Если будет время и желание, чтобы довести все до конца (и если к тому времени не отпадет необходимость в этом) могу выложить то, что получится.
...
Рейтинг: 0 / 0
VFP8. Как узнать размер файла в поле типа general ?
    #33053427
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CrispyЯ где-то тоже читал про это. Но тут вдруг мне стало интересно - ну неужели же, в самом деле, никак нельзя? И вдруг оказалось:
Если очень хочется, то оказывается - можно!!!
И не так уж трудно.
Достаточно вооружиться HIEW и немного подумать, чтобы осуществить "реверсинг" FPT, в котором хранится General, средствами VFP. Я уже нашел, как и где хранится размер файла в поле General, и даже примерно понял - как "выковыривать" файл оттуда. Осталось доработать программку, чтобы сделать ее универсальной.


Только следует учесть еще несколько "мелочей"

Чтобы найти адрес блока в FPT надо открыть файл DBF на низком уровне и прочитать в нем ссылку на номер блока. А чтобы открыть файл DBF на низком уровне надо предварительно выгнать всех пользователей, которые работают с этой таблице. То же самое касается и собственно файла FPT

В поле General храниться не только сам файл, но и ссылка на программу, при помощи которой этот файл следует читать. Как именно они там "смешаны" я не в курсе. Что-то я ничего на эту тему не нашел в HELP. Следовательно, в общем случае, размер информации в FPT будет больше, чем реальный размер файла

Ну, а если очень "хочется помучиться", то во вложенном файле в том числе описана и структура хранения данных в Memo-поле
...
Рейтинг: 0 / 0
VFP8. Как узнать размер файла в поле типа general ?
    #33054701
Igor Korolyov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hi Crispy!

> нету простого универсального способа извлечения информации из этого поля

Это не противоречит твоим изысканиям :)

Я лишь опасаюсь, что собственно Ole-заголовок может оказаться весьма капризным - и РАЗНЫМ для разных типов Ole-серверов... А так - скажем способ извлечения bmp описан в статье MSKB (вроде там ориентировались как раз на фиксированные размеры Ole-заголовока, точно не скажу - ибо не пользовался я никогда этой штукой :) Генералом в смысле :) )

Кстати насчёт "проблем" описанных Владимиром - IMHO он не подумал о том, что из этой таблицы можно сделать выборку - одну запись, и тогда отпадает масса сложностей :)

Posted via ActualForum NNTP Server 1.1
...
Рейтинг: 0 / 0
VFP8. Как узнать размер файла в поле типа general ?
    #33054758
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Igor Korolyov
Кстати насчёт "проблем" описанных Владимиром - IMHO он не подумал о том, что из этой таблицы можно сделать выборку - одну запись, и тогда отпадает масса сложностей :)
Действительно. Тогда в первом приближении размер информации, записанной в поле General можно определить так:

Код: plaintext
1.
2.
3.
4.
SELECT MyGenField FROM MyTable INTO TABLE OneGen WHERE id = (код записи)
LOCAL laDir( 1 )
=ADIR(laDir,"OneGen.fpt")
?laDir[ 1 , 2 ]- 512 - 8 

Т.е. идея в том, что в этой временной таблице OneGen в файле FPT будет информация только из одного поля одной записи. Вычитаем размер заголовочной части и получаем, размер, который храниться в поле General с точностью до 64 байт (размер одного блока).

Но насколько это будет соответствовать реальному размеру файла - сказать трудно.
...
Рейтинг: 0 / 0
VFP8. Как узнать размер файла в поле типа general ?
    #33057059
Crispy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
2Igor Korolyov :

>можно сделать выборку - одну запись, и тогда отпадает масса сложностей :)

Хорошая идея! А то я у себя просто делал копирование всего файла во временный файл, но в реальном случае при большом размере это, конечно, давало бы замедление.

2ВладимирМ :

>Но насколько это будет соответствовать реальному размеру файла - сказать трудно.

Когда я просматривал FPT, имея смутное представление о его структуре, в числе прочих полезных наблюдений, я наткнулся на такую вещь - после всех указаний имени хранимого файла (первый раз - полное имя, потом два раза - обрезанное, но с путем) - стоит как раз раз размер файла - в шестнадцатиричном формате "задом-наперед" (характерная вещь) - читаем его сзади и элементарно преобразуем в размер - с точностью до байта само собой!
Точно так же легко "выковыривается" и сам файл - идем в FPT по адресу, найденному перед этим в DBF для этой записи и этого поля - он тоже "вывернутый"". От той позиции, куда попали, делаем необходимый отступ, я тут читаю по дороге заодно имя файла и размер. После размера через нулевой байт - как раз начало файла (совершенно ничем не искореженного). Читаем его до слова: METAFILEPICT. Затем отсупаем от его начала назад на 14 символов - это конец искомого файла.
Я реализовал все это в небольшой программке, пока, правда, еще не "отшлифовал" все мелочи. Но реально - все работает.

Вот только не знаю пока - для чего может понадобиться вытаскивать хранимый файл из General? Хотя, все же чувствую, что для чего-то вдруг может и понадобиться
...
Рейтинг: 0 / 0
VFP8. Как узнать размер файла в поле типа general ?
    #33057086
Crispy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Совсем забыл! Конечно же в DBF хранится не адрес записи General, находящейся в FPT (как я написал выше), а адрес 64-байтного блока! Его надо умножить сначала на 64 - тогда только будет адрес. Далее - 84 байта "ненужной информации", после чего - полное имя файла, ну и т.д.
...
Рейтинг: 0 / 0
VFP8. Как узнать размер файла в поле типа general ?
    #33058506
Crispy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Еще кое-что забыл! Чуть не самое главное. ну - ваще... :)
Этот вариант я разработал еще перед праздниками. А потом мне пришла в голову идея - не искать конец хранимого файла - а попросту отсчитывать от начала то число байтов, которое только что найдено - размер файла - вот и будет считан весь файл! Например, блоками по 1000, и в конце - остаток от деления размера на 1000. Такой вариант реализуется уж и совсем просто. Все это я по-быстрому и сделал, и - надо же! - уже позабыл про это. А то, что было до праздников, запомнилось...

Так что, если кому понадобится "разобраться" с General, наверное, теперь и сам сможет все реализовать - незачем выкладывать мой вариант.
...
Рейтинг: 0 / 0
VFP8. Как узнать размер файла в поле типа general ?
    #33058734
Igor Korolyov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hi Crispy!

C какими типами Ole-данных ты это проворачивал? Будет ли оно обинаково хорошо работать с bmp, jpg (причём "подцепленными" к разным Ole-серверам!!!), doc, xls, pdf и прочим? Не коряжутся ли файлы при запихивании их внутрь General-а? может какой-нить из элементов структуры скажем doc убивается?

Posted via ActualForum NNTP Server 1.1
...
Рейтинг: 0 / 0
VFP8. Как узнать размер файла в поле типа general ?
    #33060251
Crispy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Hi, Igor Korolyov !

Вообще-то, едва я услышал "поле General", у меня почему-то сразу всплыло: "Картинка" :)
Я и проверял для JPG, GIF. Потом для интереса проверил MP3, WMV. Все вышеописанное замечательно шло для этих файлов...
Но сегодня посмотрел, что будет для DOC, XLS - и понял: разработчики успешно постарались - чтоб жизнь малиной не казалась - там внутри - не совсем то, что снаружи :) ...
В случае с BMP - небольшое отличие от "нормальных" форматов - нет имени, но остальное все на месте, и он тоже отлично "выковыривается".
Какие-то еще другие форматы пока не смотрел.
В принципе с оффисными форматами, думаю, тоже можно было бы достичь приемлемого результата - было бы желание... А я пока что не знаю даже - для чего бы все это было нужно?

По-крайней мере, с мультимедиа - вроде бы вышеописанный способ срабатывает (можно , конечно, для полной уверенности посмотреть еще и другие распространенные форматы). Только забыл (опять :) в прошлый раз добавить, что FPT страшно раздувается от любых действий по удалению-повторному занесению, и каждый раз приходится делать PACK MEMO, чтоб облегчить себе жизнь :)
...
Рейтинг: 0 / 0
VFP8. Как узнать размер файла в поле типа general ?
    #33061116
Igor Korolyov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hi Crispy!

Для полноты эксперимента ещё нужно проверить зависимость от разных Ole серверов. Ибо тот-же примитивный BMP могут "подцепить" несколько программ (в бинарнике должен быть виден их ProgID) - есть такое опасение, что какой-нить ACDSee или Photoshop тоже искочевряжут файл до неузнаваемости :(
Кстати от того и проблема General-а "на одной машине картинка, на другой - тока иконка".
> забыл (опять :) в прошлый раз добавить, что FPT страшно раздувается
Да, это известная проблема с fpt :( Причём что для General, что для memo... Тока в Exclusive полегче с распуханием, но разве это работа :(

Posted via ActualForum NNTP Server 1.1
...
Рейтинг: 0 / 0
VFP8. Как узнать размер файла в поле типа general ?
    #33062811
Crispy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Hi, Igor Korolyov !

Честно говоря, хотел было я наплевать на этого генерала :), да любопыьство одолело по поводу кто, что может подцепить :)
"Перецепив" BMP, я обнаружил, что несмотря на то, что он из семейки виндовс :), ведет себя вполне добропорядочно - даже размер его хранится "на месте", разве что - с округлением до 64 байт, ну да это же мелочь, по сравнению с двумя братьями DOC-XLS...
Видимо все-таки цепляние не играет особой роли?
Попробовал еще одного их родственника - презентацию PPS. Как ни странно, хотя она внутри генерала и несколько раздувается :), но, найдя по некоторым признакам конец файла - успешно выковыривается и просматривается.
Попробовал для компании засунуть генералу и AVI (целый фильм!). Здесь все оказалось и вообще занятно: НИЧЕГО не было засунуто, кроме АДРЕСА(имени) этого фильма! То-то у меня вызывал подозрение тот факт, что, по уверениям хелпа, размер файла, хранимого в генерале ограничен только винтом, а участок, отведенный под "нормальный адрес" в FPT - всего 3 байта!
Вообще внутренности генерала используются весьма своеобразно - если файл меньше какого-то минимума (не уточнял, но кажется это 2-3 десятка кило), в качестве "заполнителя" туда, до конца этой конкретной записи набивается еще какая-то ненужная ерунда. У больших по размеру файло такого уже нет. Я экспериментировал на TXT-файлах.
Так что маленькие файлы хранить в генерале - смысла нет! (А слишком большие он и сам не хранит)
Вот такое получается кино! :)

Кстати, попробовал засунуть туда PDF - он повел себя вполне замечательно - в духе мультимедийных файлов JPG, GIF, о которых я прошлый раз упоминал.

Странный, конечно, этот формат с таким странным именем. General то - означает "главный". Только почему же он главный?... Или это мечта того, кто его придумал?
...
Рейтинг: 0 / 0
VFP8. Как узнать размер файла в поле типа general ?
    #33065644
Igor Korolyov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hi Crispy!

Ну дык не стоит смешивать linked и embedded документы :) Интерес представляют именно "внедрённые"... А для них все лимиты на месте - и 2Гб на размер fpt тоже.

Posted via ActualForum NNTP Server 1.1
...
Рейтинг: 0 / 0
VFP8. Как узнать размер файла в поле типа general ?
    #33067106
Crispy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Hi, Igor Korolyov !

А как это делается? К примеру берем kino.avi (658 М), делаем (с pack memo после переписывания, само собой):
1) APPEND GENERAL g1 FROM kino.avi
2) APPEND GENERAL g1 FROM kino.avi LINK
В первом случае размер FPT - 473 кБ, во втором - 952 кБ (чуть больше всяческой инфы напмхано). А суть получается одна - связь по ссылке?
Сколько я не смотрел в хелп - других вариантов не увидел.
...
Рейтинг: 0 / 0
VFP8. Как узнать размер файла в поле типа general ?
    #33068491
Igor Korolyov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hi Crispy!

Понятия не имею - возможно этот тип в принципе не может быть embedded... Вообще это всё IMHO зависит от Ole сервера - ему жить с этим бинарным мусором - фокс скорее всего минимально "окружает" ole-данные.

Posted via ActualForum NNTP Server 1.2
...
Рейтинг: 0 / 0
VFP8. Как узнать размер файла в поле типа general ?
    #33069122
Crispy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ну, думаю на этом вопрос можно уже и закрыть.
Итоги:
1) Для некоторых, подгружаемых в поле General форматов файлов (JPG, GIF, PDF, MP3 и пр.медиа, частично BMP) - можно определять размер (он прописан в FPT таблицы DBF) и даже извлекать их оттуда средствами VFP (на низком уровне - см.выше).
2) Для некоторых же (прежде всего DOC и XLS) - простыми средствами сделать этого не удается.
3) Маленькие файлы (<20 кб) General хранит неэкономно, а большие (по-крайней мере сотни МБ) - не хранит вовсе - содержит лишь ссылки на них.

Я все это к тому только написал, что может кому когда пригодится.
Спасибо Igor Korolyov за участие в дискуссии.
...
Рейтинг: 0 / 0
17 сообщений из 17, страница 1 из 1
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / VFP8. Как узнать размер файла в поле типа general ?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]