Форум: "Основная";
Текущий архив: 2002.12.12;
Скачать: [xml.tar.bz2];
ВнизКак удалить отображённый в пямяти файл Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.005 c