На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Модераторы: SCINER, B.V.
  
    > Можно ли уменьшить размер файла? , Без перезаписи во временный файл
      Смысл такой:
      Есть файл, в котором нужно удалить блок данных скажем где-то в середине файла.
      Тогда мы берём все данные за удаляемым блоком и двигаем их в позицию блока.
      В результате то что мы хотели удалить затирается, а в конце файла остаётся мусор.

      Вопрос в том, можно ли как-то отрезать этот мусор в конце файла, тем самым уменьшив размер данного файла?

      Просто файл может быть довольно большим, и создание временного файла не лучший вариант.
      Да и такой подход выглядит красивее.

      Добавлено
      Отлично! Всё работает как часы :)

      Вот что у меня получилось.
      Думаю многим пригодится.

      ExpandedWrap disabled
        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


      Использовать так:
      ExpandedWrap disabled
        ' Установить размер существующего файла равным 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 ;)
      Сообщение отредактировано: SCINER -
      0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
      0 пользователей:


      Рейтинг@Mail.ru
      [ Script execution time: 0,0169 ]   [ 16 queries used ]   [ Generated: 27.04.24, 14:53 GMT ]