Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как удалить отображённый в пямяти файл [D7, Win2k]


SkyQuake ©   (2002-11-30 13:56:00) 

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


SkyQuake   (2002-12-02 06:43:00) [1]

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


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

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


SkyQuake   (2002-12-01 13:57:00) [3]

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


Сергей Бушин   (2002-12-01 13:06:00) [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 10:26:00) [5]

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

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


Cobalt   (2002-11-30 15:44:00) [6]

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


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

UnMapViewOfFile


Наверх

Титульная страница Поиск, карта сайта Написать письмо