Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
14-36347
Bill
2002-11-20 22:04
2002.12.12
TStringGrid


1-36118
Alecs
2002-12-03 09:36
2002.12.12
Кто родитель компонента?


14-36350
Ketmar
2002-11-20 17:55
2002.12.12
test2


1-36229
sancho
2002-12-01 20:18
2002.12.12
Как унать на каком языке текст:англ. или русском?


1-36241
Mishel
2002-11-29 14:03
2002.12.12
АБСОЛЮТНЫЙ запрет на сворачивание окна





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский