
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.97.14.88] |
![]() |
|
Сообщ.
#1
,
|
|
|
Смысл такой:
Есть файл, в котором нужно удалить блок данных скажем где-то в середине файла. Тогда мы берём все данные за удаляемым блоком и двигаем их в позицию блока. В результате то что мы хотели удалить затирается, а в конце файла остаётся мусор. Вопрос в том, можно ли как-то отрезать этот мусор в конце файла, тем самым уменьшив размер данного файла? Просто файл может быть довольно большим, и создание временного файла не лучший вариант. Да и такой подход выглядит красивее. Добавлено Отлично! Всё работает как часы ![]() Вот что у меня получилось. Думаю многим пригодится. ![]() ![]() Private Declare Function CreateFile Lib "kernel32" Alias "CreateFileA" (ByVal lpFileName As String, ByVal dwDesiredAccess As Long, ByVal dwShareMode As Long, lpSecurityAttributes As Long, ByVal dwCreationDisposition As Long, ByVal dwFlagsAndAttributes As Long, ByVal hTemplateFile As Long) As Long Private Declare Function SetFilePointer Lib "kernel32" (ByVal hFile As Long, ByVal lDistanceToMove As Long, lpDistanceToMoveHigh As Long, ByVal dwMoveMethod As Long) As Long Private Declare Function SetEndOfFile Lib "kernel32" (ByVal hFile As Long) As Boolean Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long Private Const GENERIC_WRITE = &H40000000 Private Const CREATE_NEW = 1 Private Const OPEN_EXISTING = 3 Private Const FILE_SHARE_READ = &H1 Private Const FILE_SHARE_WRITE = &H2 Private Const FILE_BEGIN = 0 Private Const FILE_END = 2 Public Function ResizeFile(FileName As String, EOFPosition As Long, Optional Relative As Boolean = False, Optional CreateNew As Boolean = False) As Boolean Dim hFile As Long, CNF As Long, FEOF As Long ' Флаги If CreateNew Then CNF = CREATE_NEW Else CNF = OPEN_EXISTING If Relative Then FEOF = FILE_END Else FEOF = FILE_BEGIN ' Ресайзим файл hFile = CreateFile(FileName, GENERIC_WRITE, FILE_SHARE_READ Or FILE_SHARE_WRITE, ByVal 0&, CNF, 0, 0) If hFile = 0 Then Exit Function SetFilePointer hFile, EOFPosition, 0, FEOF ResizeFile = SetEndOfFile(hFile) CloseHandle hFile End Function Использовать так: ![]() ![]() ' Установить размер существующего файла равным 10 байтам ResizeFile "C:\testfile.txt", 10 ' Увеличть размер существующего файла на 10 байт (отрицательное число будет уменьшать) ' Отчёт идёт относительно текущего конца файла ResizeFile "C:\testfile.txt", 10, True ' Создать файл размером 10 байт ' При этом файл будет заполнен нулевыми байтами ResizeFile "C:\testfile.txt", 10, False, True ResizeFile "C:\testfile.txt", 10, True, True ' Функция вернёт True если удалось поменять размер и False в противном случае PS: Респект SCINER'у за декларацию SetEndOfFile ![]() |