Страница: 1 | 2 |
Вопрос: Замена текста в файле
Добавлено: 22.10.04 18:58
Автор вопроса: Junior
Ответы
Всего ответов: 22
Номер ответа: 16
Автор ответа:
CyRax
Разработчик Offline Client
ICQ: 204447456
Вопросов: 180
Ответов: 4229
Web-сайт:
Профиль | | #16
Добавлено: 26.10.04 00:22
Маппинг это уж слишком. С ним можно только через API работать. А вот вставить данные внутрь файла никак нельзя. Можно либо дописать в конец, либо переписать файл по новой. Да и вообще нигде нельзя вставлять данные внутрь, а даже если где то и есть, то это замаскированная перезапись. Ну или база данных, которая вообще по своему устроена.
Номер ответа: 17
Автор ответа:
mc-black
ICQ: 308-534-060
Вопросов: 20
Ответов: 1860
Web-сайт:
Профиль | | #17
Добавлено: 26.10.04 14:36
Расскажите про маппинг (FileMapping functions)! И ещё: как-то слышал, что можно данные не в файл писать, а мимо. В свободные кластеры или даже в свободное место кластера, частично занятого другим файлом. Может у кого пример есть? Как-то же делают операцию Wipe в диск-утилитах!
Номер ответа: 18
Автор ответа:
sne
Разработчик Offline Client
ICQ: 233286456
Вопросов: 34
Ответов: 5445
Web-сайт:
Профиль | | #18
Добавлено: 26.10.04 21:17
Как это нельзя, можно все перезаписать... Если размеры данных для записи совпадают с размерами данных подлежащим перезаписи...
Про остаточное место... это да... я тоже слышал... но ничего подобного я не встречал...
Номер ответа: 19
Автор ответа:
CyRax
Разработчик Offline Client
ICQ: 204447456
Вопросов: 180
Ответов: 4229
Web-сайт:
Профиль | | #19
Добавлено: 27.10.04 02:29
Рассказывать ничего не буду. Просто опубликую модуль здесь. Использовать его очень просто.
Память = MappingBegin(FName$)
MappingEnd
Option Explicit
Private FileHandle As Long
Private FileMappingHandle As Long
Private FileViewBase As Long
Private Declare Function CreateFile Lib "kernel32" _
Alias "CreateFileA" ( _
ByVal lpFileName As String, _
ByVal dwDesiredAccess As Long, _
ByVal dwShareMode As Long, _
ByVal lpSecurityAttributes As Long, _
ByVal dwCreationDisposition As Long, _
ByVal dwFlagsAndAttributes As Long, _
ByVal hTemplateFile As Long _
) As Long
Private Declare Function GetFileSize Lib "kernel32.dll" ( _
ByVal hFile As Long, _
ByRef lpFileSizeHigh As Long) As Long
Private Declare Function CreateFileMapping Lib "kernel32" _
Alias "CreateFileMappingA" ( _
ByVal hFile As Long, _
ByVal lpSecurityAttributes As Long, _
ByVal flProtect As Long, _
ByVal dwMaximumSizeHigh As Long, _
ByVal dwMaximumSizeLow As Long, _
ByVal lpName As String _
) As Long
Private Declare Function MapViewOfFile Lib "kernel32" ( _
ByVal hFileMappingObject As Long, _
ByVal dwDesiredAccess As Long, _
ByVal dwFileOffsetHigh As Long, _
ByVal dwFileOffsetLow As Long, _
ByVal dwNumberOfBytesToMap As Long _
) As Long
Private Declare Function CloseHandle Lib "kernel32" ( _
ByVal hObject As Long) As Long
Private Declare Function UnMapViewOfFile Lib "kernel32" _
Alias "UnmapViewOfFile" (ByVal lpBaseAddress As Long) As Long
Public Function OpenFile(FileName As String) As Long
Const GENERIC_READ = &H80000000
Const GENERIC_WRITE = &H40000000
Const FILE_SHARE_READ = &H1
Const FILE_SHARE_WRITE = &H2
Const OPEN_EXISTING = 3
' Opens file and gets file handle
FileHandle = CreateFile(FileName, _
GENERIC_READ Or GENERIC_WRITE, _
FILE_SHARE_READ Or FILE_SHARE_WRITE, _
0&, _
OPEN_EXISTING, 0&, 0&
OpenFile = FileHandle
End Function
Public Function OpenFileMapping() As Long
Const PAGE_READWRITE = &H4
' Create file mapping
FileMappingHandle = CreateFileMapping( _
FileHandle, 0&, PAGE_READWRITE, 0&, _
GetFileSize(FileHandle, 0), vbNullString)
OpenFileMapping = FileMappingHandle
End Function
Public Function MapFileView() As Long
Const SECTION_MAP_READ = &H4
Const SECTION_MAP_WRITE = &H2
Const FILE_MAP_READ = SECTION_MAP_READ
Const FILE_MAP_WRITE = SECTION_MAP_WRITE
FileViewBase = MapViewOfFile( _
FileMappingHandle, FILE_MAP_WRITE, 0&, 0&, 0&
MapFileView = FileViewBase
End Function
Public Function UnMapFileView() As Long
UnMapFileView = UnMapViewOfFile(FileViewBase)
End Function
Public Function CloseFileMapping() As Long
CloseFileMapping = CloseHandle(FileMappingHandle)
End Function
Public Function CloseFile() As Long
CloseFile = CloseHandle(FileHandle)
End Function
Function MappingBegin(FileName As String) As Long
Call OpenFile(FileName)
Call OpenFileMapping
MappingBegin = MapFileView
End Function
Sub MappingEnd()
Call CloseFileMapping
Call CloseFile
Call UnMapFileView
FileHandle = 0
FileMappingHandle = 0
FileViewBase = 0
End Sub
Содержимое файла проецируется в память, а тебе выдаётся указатель на первый байт. Его (указатель) ты можешь использовать с любой API, которая работает с памятью.
Номер ответа: 20
Автор ответа:
CyRax
Разработчик Offline Client
ICQ: 204447456
Вопросов: 180
Ответов: 4229
Web-сайт:
Профиль | | #20
Добавлено: 27.10.04 02:32
Да, ещё, если функция провалилась, то MappingBegin возвращает -1.
MappingBegin - это обёртка. Я её написал чтобы скрыть рутинную инициализацию.
Номер ответа: 21
Автор ответа:
CyRax
Разработчик Offline Client
ICQ: 204447456
Вопросов: 180
Ответов: 4229
Web-сайт:
Профиль | | #21
Добавлено: 27.10.04 02:36
По поводу второго я вообще без балды, но могу предположить что: во первых тебе нужно сначала изучить FAT/NTFS; а во вторых, тебе скорее всего понадобится драйвер, т.к. в пользовательском режиме доступ к оборудованию не предусмотрен.
Номер ответа: 22
Автор ответа:
CyRax
Разработчик Offline Client
ICQ: 204447456
Вопросов: 180
Ответов: 4229
Web-сайт:
Профиль | | #22
Добавлено: 27.10.04 02:40
И ещё, советую доработать этот модуль, т.к. он переделан из модуля класса (ну не люблю я классы по любому поводу использовать) со всеми вытекающими отсюда последствиями.