Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.12.12;
Скачать: CL | DM;

Вниз

Как удалить отображённый в пямяти файл   Найти похожие ветки 

 
SkyQuake ©   (2002-11-30 13:56) [0]

Функция DeleteFile терпит неудачу если пытается удалить файл, который открыт для ввода-вывода или как файл спроецированный в память. Проблема присутсвует только в WinNT-подобных осях. Внешне проявлется просто: жму на кнопку за которой код:
DeleteFile(PChar(FileName));
а файл как был так и остаётся. В проводнике удаляется замечательно. Стало быть он спроецирован в память (наверно потому что размером с десяток метров и предварительно мною же считывается с помощью TFileStream) раз не удаляется с помощью DeleteFile. Но вот как его разотобразить?


 
Сергей Бушин ©   (2002-11-30 14:49) [1]

UnMapViewOfFile


 
Cobalt ©   (2002-11-30 15:44) [2]

А что говорит GetLastError?


 
SkyQuake ©   (2002-12-01 10:26) [3]

>Cobalt: Возвращает 5

>Сергей Бушин: UnMapViewOfFile требует BaseAddress:Pointer в качестве параметра. Я так полагаю это адрес в памяти этого файла, но как его узнать?


 
Сергей Бушин ©   (2002-12-01 13:06) [4]

Вообще для работы отображаемыми в память файлами существуют следующие функции:

CreateFileMapping(hFile:THANDLE,lpFileMappingAttributes:PSECURITY_ATTRIBUTES ,
flProtect,
dwMaximumSizeHigh,
dwMaximumSizeLow:DWORD,
lpName: PChar):THandle;

Первый параметр дискриптор уже открытого файла (см. CreateFile),
второй это указатель на SECURITY_ATTRIBUTES (его надо в nil),
flProtect это атрибут защиты. Два следующих параметра ставь в 0. И последний параметр это имя твоего объекта файлового отображения. Результат дискриптор.

Затем нужна функция MapViewOfFile, которая спроецирует файл в адресное пространство процесса.

MapViewOfFile(hFileMappingObject:THandle,
dwDesiredAccess,
dwFileOffsetHigh,
dwFileOffsetLow,
dwNumberOfBytesToMap:DWORD):Pointer;

Первый параметр это результат предыдущей функции т.е. CreateFileMapping, второй определяет режим доступа. Третий и четвертый параметр это смещение отображаемого участка относительно начала файла в байтах. Пятый это количество байт, которые необходимо отобразить.

Результат, как раз то что тебе и надо, но метод UnMapViewOfFile нужно вызывать перед CloseHandle. Т.е. тебе нужно сделать так:

CreateFile
CreateFileMapping
MapViewOfFile
...
UnMapViewOfFile
CloseHandle

Вроде все


 
SkyQuake ©   (2002-12-01 13:57) [5]

>Сергей Бушин: Спасибо за полезную информацию. Я стал богаче знаниями. Но. Здесь вызов UnMapViewOfFile подразумевается сугубо после CreateFile, CreateFileMapping и MapViewOfFile. Т.е. необходимо самому спрецировать файл. В моей же ситуации файл спроэцировала сама система и всё что у меня есть это имя файла. Допустим я вызываю FileCreate(FileName), а мне возвращается -1.
Пытаюсь удалить или переименовать - ни чего не происходит. Но ведь проводник прекрасно его переименовывает и удаляет.


 
Сергей Бушин ©   (2002-12-01 15:56) [6]

А что говорит GetLastError?
И вообще по подробнее.


 
SkyQuake ©   (2002-12-02 06:43) [7]

Просто невероятно. Оказывается у файла на котором я проводил тестирование стоял флаг "Только чтение"! Стоило его снять и всё заработало. С ума сойти. Попросту фразу: "Функция DeleteFile терпит неудачу если пытается удалить файл, который открыт для ввода-вывода или как файл спроецированный в память" взятую из хелпа по API надо уточнить, тем что функция терпит неудачу и в случае с флагом "Только чтение".



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

Текущий архив: 2002.12.12;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.024 c
1-36221
Batik
2002-11-30 19:18
2002.12.12
Реакция на клавишы....


14-36353
Феликс
2002-11-20 21:34
2002.12.12
Тема для сайта


4-36453
Novichek
2002-10-18 01:28
2002.12.12
как вывести на форму значек состояниия клавиатуры?


3-36041
_toltec
2002-11-23 03:08
2002.12.12
Хранимая процедура


3-36022
keymaster
2002-11-25 09:30
2002.12.12
Посоветуйте умную книжку