Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2009.12.13;
Скачать: [xml.tar.bz2];

Вниз

открытие содерж. blob-поля во врем. файле   Найти похожие ветки 

 
Zzzz   (2009-10-23 22:06) [0]

Задача - считать содержимое blob-поля БД во временный файл и открыть его программой, кот. открывает файлы этого типа. Причем желательно, чтобы сам файл вообще не сбрасывался на диск - для этого я применяю комбинацию флагов FILE_ATTRIBUTE_TEMPORARY or FILE_FLAG_DELETE_ON_CLOSE. А как только ту программу закроют, файл удаляется.

var blob:TStream; f:file; s:string; i:integer; j:dword; buffer:array[0..2047] of byte; //в s - имя файла

blob:=adoDataset1.CreateBlobStream(adodataset1.Fields[0], bmRead);
blob.Seek(0, soFromBeginning);
f:=CreateFile(PChar(s), GENERIC_READ or
GENERIC_WRITE,
FILE_SHARE_READ or FILE_SHARE_WRITE,
nil, CREATE_NEW,
FILE_ATTRIBUTE_TEMPORARY or FILE_FLAG_DELETE_ON_CLOSE, 0);

Далее я копирую в файл из blob с пом. writefile и запускаю:
repeat
i:=blob.Read(buffer,2048);
writefile(f,buffer,i,j,nil);
until j<2048;
blob.free;
ShellExecute(Handle, "open", pchar(s), nil, nil, SW_SHOW);

И в результате не открывается вообще ничего. Т. е. ACDSee запускается, и имя файла, кот. записано в s, видно в заголовке ACDSee примерно долю секунды, потом ACDSee меняет заголовок на тот, в кот. находится сама программа. Изображение так и не появляется. В чем может быть дело?


 
Loginov Dmitry ©   (2009-10-23 23:04) [1]

Фокусами Вы тут занимаетесь, имхо!
Если ACDSee, то сохраняйте файл по-нормальному, например
blob.SaveToFile
Если без сохранения в файл, то добавьте в своем приложении
окно с компонентом TImage, и в него загружайте изображение
(в некоторых случаях можно использовать TDBImage).


 
Zzzz   (2009-10-23 23:29) [2]


> Если ACDSee, то сохраняйте файл по-нормальному, например
> blob.SaveToFile

Пробовал, работало. Но надо тогда чтобы старые файлы удалялись. Только как это лучше сделать? Удалять все файлы в опред. папке при запуске программы? Просто хотелось чтобы ОС сама их удаляла и чтобы не заморачиваться с удалением самому.


 
Loginov Dmitry ©   (2009-10-23 23:36) [3]

> Но надо тогда чтобы старые файлы удалялись. Только как это
> лучше сделать? Удалять все файлы в опред. папке при запуске
> программы?


Неплохой вариант.


 
Сергей М. ©   (2009-10-23 23:53) [4]


> В чем может быть дело?


В том что система успевает удалить файл ДО того как ACDSee его откроет.


 
Zzzz   (2009-10-24 14:08) [5]


> В том что система успевает удалить файл ДО того как ACDSee
> его откроет.

Но он ведь должен удалятьcя после закрытия, а я его явно не закрываю, значит не должен удаляться?


 
Loginov Dmitry ©   (2009-10-24 14:18) [6]

> а я его явно не закрываю, значит не должен удаляться?


На самом делей Ваш код выполняет создание файла, и после этого
файл остается открытым в монопольном режиме. У ACDSee нет прав
на открытие данного файла. Изучите справку по функции CreateFile(),
возможно она позволяет выполнить создание нового файла без
монопольного доступа на чтение.


 
Palladin ©   (2009-10-24 14:26) [7]


> Zzzz   (24.10.09 14:08) [5]

ты мудришь чего то слишком...

1 заведи директорию для временных файлов
2 скидывай туда файлы и открывай
Var
f:TFileStream;
...
f:=TFileStream.Create(<random_file_name>,fmCreate);
Try
f.CopyFrom(blob,0);
Finally
f.free;
End;
ShellExecute(...)

3 при завершении приложения убивай временную директорию


 
Loginov Dmitry ©   (2009-10-24 14:44) [8]

> возможно она позволяет выполнить создание нового файла без
> монопольного доступа на чтение.


Кстати API позволяет. Непонятно, по какой причине TFileCtream.Create()
не учитывает флаги fmShareDenyXXX.

Из хэлпа:
ranges of bytes.
FILE_FLAG_DELETE_ON_CLOSE
Indicates that the operating system is to delete the file immediately after all of its handles have been closed, not just the handle for which you specified FILE_FLAG_DELETE_ON_CLOSE. Subsequent open requests for the file will fail, unless FILE_SHARE_DELETE is used.


Очень сомневаюсь, что ACDSee открывает файл с атрибутом FILE_SHARE_DELETE :)


 
Zzzz   (2009-10-24 15:48) [9]

Попробовал с флагом FILE_SHARE_DELETE, закрывая файл сразу после открытия ACDSee:
ShellExecute(Handle, "open", pchar(s), nil, nil, SW_SHOW);
fileclose(f);

Файл нормально открывается, но когда ACDSee закрываешь (вместе с самой программой), то файл так и остается на диске. Не удаляется.


 
Zzzz   (2009-10-24 15:55) [10]

Извиняюсь, перепутал. Я FILE_FLAG_DELETE_ON_CLOSE убирал, в потом забыл снова поставить. А ACDSee теперь говорит, что "Программа просмотра не обнаружила файл в системе".


 
Сергей М. ©   (2009-10-24 16:42) [11]


> Zzzz   (24.10.09 14:08) [5]


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


 
Zzzz   (2009-10-24 17:21) [12]

Да нет, не завершаю. Вот убрал fileclose(f) (кот. в самом конце после ShellExecute), и теперь ACDSee пишет "Исходный формат данных не опознан".



Страницы: 1 вся ветка

Форум: "Начинающим";
Текущий архив: 2009.12.13;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.47 MB
Время: 0.006 c
3-1231501515
Виталий Панасенко
2009-01-09 14:45
2009.12.13
Ошибка с CHAR_SET WIN1251


2-1256729336
Morgan128
2009-10-28 14:28
2009.12.13
Как отследить действия над сторонним окном?


15-1255523606
s_t_d
2009-10-14 16:33
2009.12.13
Книга, где есть основы работы с IDE MS Visual Studio 2008


2-1256302450
Сергей
2009-10-23 16:54
2009.12.13
Не работает WaitForSingleObject.


2-1256126911
Nucer
2009-10-21 16:08
2009.12.13
Из WideChar в Char





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский