|
|
|
VFP8. Как узнать размер файла в поле типа general ?
|
|||
|---|---|---|---|
|
#18+
VFP8. Как узнать размер файла, который храниться в поле типа general ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.05.2005, 16:27 |
|
||
|
VFP8. Как узнать размер файла в поле типа general ?
|
|||
|---|---|---|---|
|
#18+
Hi Dmitriy! Никак. Равно как и нету простого универсального способа извлечения информации из этого поля - потому лучше использовать Memo binary для хранения файлов - если уж так хочется их в таблицу запихивать :) Posted via ActualForum NNTP Server 1.1 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.05.2005, 01:21 |
|
||
|
VFP8. Как узнать размер файла в поле типа general ?
|
|||
|---|---|---|---|
|
#18+
Hi, Igor Korolyov ! >Никак. Равно как и нету простого универсального способа извлечения информации из этого поля - потому лучше использовать Memo binary для хранения файлов - если уж так хочется их в таблицу запихивать :) Я где-то тоже читал про это. Но тут вдруг мне стало интересно - ну неужели же, в самом деле, никак нельзя? И вдруг оказалось: Если очень хочется, то оказывается - можно!!! И не так уж трудно. Достаточно вооружиться HIEW и немного подумать, чтобы осуществить "реверсинг" FPT, в котором хранится General, средствами VFP. Я уже нашел, как и где хранится размер файла в поле General, и даже примерно понял - как "выковыривать" файл оттуда. Осталось доработать программку, чтобы сделать ее универсальной. to Dmitriy Sevastianov : Если будет время и желание, чтобы довести все до конца (и если к тому времени не отпадет необходимость в этом) могу выложить то, что получится. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.05.2005, 15:55 |
|
||
|
VFP8. Как узнать размер файла в поле типа general ?
|
|||
|---|---|---|---|
|
#18+
CrispyЯ где-то тоже читал про это. Но тут вдруг мне стало интересно - ну неужели же, в самом деле, никак нельзя? И вдруг оказалось: Если очень хочется, то оказывается - можно!!! И не так уж трудно. Достаточно вооружиться HIEW и немного подумать, чтобы осуществить "реверсинг" FPT, в котором хранится General, средствами VFP. Я уже нашел, как и где хранится размер файла в поле General, и даже примерно понял - как "выковыривать" файл оттуда. Осталось доработать программку, чтобы сделать ее универсальной. Только следует учесть еще несколько "мелочей" Чтобы найти адрес блока в FPT надо открыть файл DBF на низком уровне и прочитать в нем ссылку на номер блока. А чтобы открыть файл DBF на низком уровне надо предварительно выгнать всех пользователей, которые работают с этой таблице. То же самое касается и собственно файла FPT В поле General храниться не только сам файл, но и ссылка на программу, при помощи которой этот файл следует читать. Как именно они там "смешаны" я не в курсе. Что-то я ничего на эту тему не нашел в HELP. Следовательно, в общем случае, размер информации в FPT будет больше, чем реальный размер файла Ну, а если очень "хочется помучиться", то во вложенном файле в том числе описана и структура хранения данных в Memo-поле ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.05.2005, 17:35 |
|
||
|
VFP8. Как узнать размер файла в поле типа general ?
|
|||
|---|---|---|---|
|
#18+
Hi Crispy! > нету простого универсального способа извлечения информации из этого поля Это не противоречит твоим изысканиям :) Я лишь опасаюсь, что собственно Ole-заголовок может оказаться весьма капризным - и РАЗНЫМ для разных типов Ole-серверов... А так - скажем способ извлечения bmp описан в статье MSKB (вроде там ориентировались как раз на фиксированные размеры Ole-заголовока, точно не скажу - ибо не пользовался я никогда этой штукой :) Генералом в смысле :) ) Кстати насчёт "проблем" описанных Владимиром - IMHO он не подумал о том, что из этой таблицы можно сделать выборку - одну запись, и тогда отпадает масса сложностей :) Posted via ActualForum NNTP Server 1.1 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.05.2005, 16:58 |
|
||
|
VFP8. Как узнать размер файла в поле типа general ?
|
|||
|---|---|---|---|
|
#18+
Igor Korolyov Кстати насчёт "проблем" описанных Владимиром - IMHO он не подумал о том, что из этой таблицы можно сделать выборку - одну запись, и тогда отпадает масса сложностей :) Действительно. Тогда в первом приближении размер информации, записанной в поле General можно определить так: Код: plaintext 1. 2. 3. 4. Т.е. идея в том, что в этой временной таблице OneGen в файле FPT будет информация только из одного поля одной записи. Вычитаем размер заголовочной части и получаем, размер, который храниться в поле General с точностью до 64 байт (размер одного блока). Но насколько это будет соответствовать реальному размеру файла - сказать трудно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.05.2005, 19:28 |
|
||
|
VFP8. Как узнать размер файла в поле типа general ?
|
|||
|---|---|---|---|
|
#18+
2Igor Korolyov : >можно сделать выборку - одну запись, и тогда отпадает масса сложностей :) Хорошая идея! А то я у себя просто делал копирование всего файла во временный файл, но в реальном случае при большом размере это, конечно, давало бы замедление. 2ВладимирМ : >Но насколько это будет соответствовать реальному размеру файла - сказать трудно. Когда я просматривал FPT, имея смутное представление о его структуре, в числе прочих полезных наблюдений, я наткнулся на такую вещь - после всех указаний имени хранимого файла (первый раз - полное имя, потом два раза - обрезанное, но с путем) - стоит как раз раз размер файла - в шестнадцатиричном формате "задом-наперед" (характерная вещь) - читаем его сзади и элементарно преобразуем в размер - с точностью до байта само собой! Точно так же легко "выковыривается" и сам файл - идем в FPT по адресу, найденному перед этим в DBF для этой записи и этого поля - он тоже "вывернутый"". От той позиции, куда попали, делаем необходимый отступ, я тут читаю по дороге заодно имя файла и размер. После размера через нулевой байт - как раз начало файла (совершенно ничем не искореженного). Читаем его до слова: METAFILEPICT. Затем отсупаем от его начала назад на 14 символов - это конец искомого файла. Я реализовал все это в небольшой программке, пока, правда, еще не "отшлифовал" все мелочи. Но реально - все работает. Вот только не знаю пока - для чего может понадобиться вытаскивать хранимый файл из General? Хотя, все же чувствую, что для чего-то вдруг может и понадобиться ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.05.2005, 12:08 |
|
||
|
VFP8. Как узнать размер файла в поле типа general ?
|
|||
|---|---|---|---|
|
#18+
Совсем забыл! Конечно же в DBF хранится не адрес записи General, находящейся в FPT (как я написал выше), а адрес 64-байтного блока! Его надо умножить сначала на 64 - тогда только будет адрес. Далее - 84 байта "ненужной информации", после чего - полное имя файла, ну и т.д. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.05.2005, 12:18 |
|
||
|
VFP8. Как узнать размер файла в поле типа general ?
|
|||
|---|---|---|---|
|
#18+
Еще кое-что забыл! Чуть не самое главное. ну - ваще... :) Этот вариант я разработал еще перед праздниками. А потом мне пришла в голову идея - не искать конец хранимого файла - а попросту отсчитывать от начала то число байтов, которое только что найдено - размер файла - вот и будет считан весь файл! Например, блоками по 1000, и в конце - остаток от деления размера на 1000. Такой вариант реализуется уж и совсем просто. Все это я по-быстрому и сделал, и - надо же! - уже позабыл про это. А то, что было до праздников, запомнилось... Так что, если кому понадобится "разобраться" с General, наверное, теперь и сам сможет все реализовать - незачем выкладывать мой вариант. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.05.2005, 20:14 |
|
||
|
VFP8. Как узнать размер файла в поле типа general ?
|
|||
|---|---|---|---|
|
#18+
Hi Crispy! C какими типами Ole-данных ты это проворачивал? Будет ли оно обинаково хорошо работать с bmp, jpg (причём "подцепленными" к разным Ole-серверам!!!), doc, xls, pdf и прочим? Не коряжутся ли файлы при запихивании их внутрь General-а? может какой-нить из элементов структуры скажем doc убивается? Posted via ActualForum NNTP Server 1.1 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.05.2005, 01:24 |
|
||
|
VFP8. Как узнать размер файла в поле типа general ?
|
|||
|---|---|---|---|
|
#18+
Hi, Igor Korolyov ! Вообще-то, едва я услышал "поле General", у меня почему-то сразу всплыло: "Картинка" :) Я и проверял для JPG, GIF. Потом для интереса проверил MP3, WMV. Все вышеописанное замечательно шло для этих файлов... Но сегодня посмотрел, что будет для DOC, XLS - и понял: разработчики успешно постарались - чтоб жизнь малиной не казалась - там внутри - не совсем то, что снаружи :) ... В случае с BMP - небольшое отличие от "нормальных" форматов - нет имени, но остальное все на месте, и он тоже отлично "выковыривается". Какие-то еще другие форматы пока не смотрел. В принципе с оффисными форматами, думаю, тоже можно было бы достичь приемлемого результата - было бы желание... А я пока что не знаю даже - для чего бы все это было нужно? По-крайней мере, с мультимедиа - вроде бы вышеописанный способ срабатывает (можно , конечно, для полной уверенности посмотреть еще и другие распространенные форматы). Только забыл (опять :) в прошлый раз добавить, что FPT страшно раздувается от любых действий по удалению-повторному занесению, и каждый раз приходится делать PACK MEMO, чтоб облегчить себе жизнь :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.05.2005, 16:01 |
|
||
|
VFP8. Как узнать размер файла в поле типа general ?
|
|||
|---|---|---|---|
|
#18+
Hi Crispy! Для полноты эксперимента ещё нужно проверить зависимость от разных Ole серверов. Ибо тот-же примитивный BMP могут "подцепить" несколько программ (в бинарнике должен быть виден их ProgID) - есть такое опасение, что какой-нить ACDSee или Photoshop тоже искочевряжут файл до неузнаваемости :( Кстати от того и проблема General-а "на одной машине картинка, на другой - тока иконка". > забыл (опять :) в прошлый раз добавить, что FPT страшно раздувается Да, это известная проблема с fpt :( Причём что для General, что для memo... Тока в Exclusive полегче с распуханием, но разве это работа :( Posted via ActualForum NNTP Server 1.1 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.05.2005, 03:04 |
|
||
|
VFP8. Как узнать размер файла в поле типа general ?
|
|||
|---|---|---|---|
|
#18+
Hi, Igor Korolyov ! Честно говоря, хотел было я наплевать на этого генерала :), да любопыьство одолело по поводу кто, что может подцепить :) "Перецепив" BMP, я обнаружил, что несмотря на то, что он из семейки виндовс :), ведет себя вполне добропорядочно - даже размер его хранится "на месте", разве что - с округлением до 64 байт, ну да это же мелочь, по сравнению с двумя братьями DOC-XLS... Видимо все-таки цепляние не играет особой роли? Попробовал еще одного их родственника - презентацию PPS. Как ни странно, хотя она внутри генерала и несколько раздувается :), но, найдя по некоторым признакам конец файла - успешно выковыривается и просматривается. Попробовал для компании засунуть генералу и AVI (целый фильм!). Здесь все оказалось и вообще занятно: НИЧЕГО не было засунуто, кроме АДРЕСА(имени) этого фильма! То-то у меня вызывал подозрение тот факт, что, по уверениям хелпа, размер файла, хранимого в генерале ограничен только винтом, а участок, отведенный под "нормальный адрес" в FPT - всего 3 байта! Вообще внутренности генерала используются весьма своеобразно - если файл меньше какого-то минимума (не уточнял, но кажется это 2-3 десятка кило), в качестве "заполнителя" туда, до конца этой конкретной записи набивается еще какая-то ненужная ерунда. У больших по размеру файло такого уже нет. Я экспериментировал на TXT-файлах. Так что маленькие файлы хранить в генерале - смысла нет! (А слишком большие он и сам не хранит) Вот такое получается кино! :) Кстати, попробовал засунуть туда PDF - он повел себя вполне замечательно - в духе мультимедийных файлов JPG, GIF, о которых я прошлый раз упоминал. Странный, конечно, этот формат с таким странным именем. General то - означает "главный". Только почему же он главный?... Или это мечта того, кто его придумал? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.05.2005, 16:00 |
|
||
|
VFP8. Как узнать размер файла в поле типа general ?
|
|||
|---|---|---|---|
|
#18+
Hi Crispy! Ну дык не стоит смешивать linked и embedded документы :) Интерес представляют именно "внедрённые"... А для них все лимиты на месте - и 2Гб на размер fpt тоже. Posted via ActualForum NNTP Server 1.1 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.05.2005, 02:09 |
|
||
|
VFP8. Как узнать размер файла в поле типа general ?
|
|||
|---|---|---|---|
|
#18+
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 кБ (чуть больше всяческой инфы напмхано). А суть получается одна - связь по ссылке? Сколько я не смотрел в хелп - других вариантов не увидел. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.05.2005, 13:52 |
|
||
|
VFP8. Как узнать размер файла в поле типа general ?
|
|||
|---|---|---|---|
|
#18+
Hi Crispy! Понятия не имею - возможно этот тип в принципе не может быть embedded... Вообще это всё IMHO зависит от Ole сервера - ему жить с этим бинарным мусором - фокс скорее всего минимально "окружает" ole-данные. Posted via ActualForum NNTP Server 1.2 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.05.2005, 01:16 |
|
||
|
VFP8. Как узнать размер файла в поле типа general ?
|
|||
|---|---|---|---|
|
#18+
Ну, думаю на этом вопрос можно уже и закрыть. Итоги: 1) Для некоторых, подгружаемых в поле General форматов файлов (JPG, GIF, PDF, MP3 и пр.медиа, частично BMP) - можно определять размер (он прописан в FPT таблицы DBF) и даже извлекать их оттуда средствами VFP (на низком уровне - см.выше). 2) Для некоторых же (прежде всего DOC и XLS) - простыми средствами сделать этого не удается. 3) Маленькие файлы (<20 кб) General хранит неэкономно, а большие (по-крайней мере сотни МБ) - не хранит вовсе - содержит лишь ссылки на них. Я все это к тому только написал, что может кому когда пригодится. Спасибо Igor Korolyov за участие в дискуссии. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.05.2005, 12:11 |
|
||
|
|

start [/forum/topic.php?fid=41&msg=33065644&tid=1594238]: |
0ms |
get settings: |
8ms |
get forum list: |
10ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
171ms |
get topic data: |
6ms |
get forum data: |
2ms |
get page messages: |
41ms |
get tp. blocked users: |
1ms |
| others: | 226ms |
| total: | 469ms |

| 0 / 0 |
