Главная страница
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.022 c
3-35989
Ajvol
2002-11-22 20:44
2002.12.12
Локальная фильтрация в FIBplus - не всё


1-36270
Palladin
2002-11-30 23:22
2002.12.12
вот такой вот вопрос


7-36451
Valt
2002-10-10 14:09
2002.12.12
Файлы в оперативку


1-36275
Vladimir1
2002-12-02 15:39
2002.12.12
Программная задержка


14-36365
Sirus
2002-11-21 11:20
2002.12.12
DsgnIntf не работает под Дельфи6. Как быть???