На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! Правила раздела Visual Basic: Общие вопросы
Здесь обсуждаются вопросы по языку Visual Basic 1-6 (а так же по схожим языкам, как, например, PowerBASIC).
Вопросы по Visual Basic .NET (это который входит в состав Visual Studio 2002/2003/2005/2008+, для тех, кто не в курсе) обсуждаются в разделе .NET.

Обратите внимание:
1. Прежде чем начать новую тему или отправить сообщение, убедитесь, что Вы не нарушаете правил форума!
2. Обязательно воспользуйтесь поиском. Возможно, Ваш вопрос уже обсуждали. Полезные ссылки приведены ниже.
3. Темы с просьбой выполнить какую-либо работу за автора в этом разделе не обсуждаются. Студенты, вам сюда: ПОМОЩЬ СТУДЕНТАМ!
4. Используйте теги [ code=vba ] ...текст программы... [ /code ] для выделения текста программы подсветкой.
5. Помните, здесь телепатов нет. Формулируйте свой вопрос максимально грамотно и чётко: Как правильно задавать вопросы
6. Запрещено отвечать в темы месячной (и более) давности, без веских на то причин.

Полезные ссылки:
user posted image FAQ Сайта user posted image FAQ Раздела user posted image Кладовка user posted image Наши Исходники user posted image API-Guide user posted image Поиск по Разделу user posted image MSDN Library Online user posted image Google

Ваше мнение о модераторах: user posted image SCINER, user posted image B.V.
Модераторы: SCINER, B.V.
  
> Можно ли уменьшить размер файла? , Без перезаписи во вренный файл
    Раньше как-то не сталкивался с работой с файлами в таком объёме, поэтому прошу помощи.

    Смысл такой:
    Есть файл, в котором нужно удалить блок данных скажем где-то в середине файла.
    Тогда мы берём все данные за удаляемым блоком и двигаем их в позицию блока.
    В результате то что мы хотели удалить затирается, а в конце файла остаётся мусор.

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

    Просто файл может быть довольно большим, и создание временного файла не лучший вариант.
    Да и такой подход выглядит красивее.
      можно есть такая функция
      ExpandedWrap disabled
        Private Declare Function SetEndOfFile Lib "kernel32" Alias "SetEndOfFile" (ByVal hFile As Long) As Long

      алгоритм действий:
      CreateFile
      SetFilePointer
      SetEndOfFile
      CloseHandle
        Окей, сейчас попробую. Если чего не получится - напишу.

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

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

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


        Рейтинг@Mail.ru
        [ Script execution time: 0,0605 ]   [ 16 queries used ]   [ Generated: 15.09.25, 21:01 GMT ]