Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > VB6 > Разбить файл на 2 части и обратно собрать


Автор: kapbepucm 4.9.2007, 12:33
Застрял на такой ерунде: надо сделать 2 процедуры.
Код
Public Sub Razbit(IshodijFail As String, Pervij As String, DlinaPervogo As Long, Vtoroj As String)
'Разбить файл IshodijFail (создать 2 новых),
'где длина Pervij в байтах = DlinaPervogo
End Sub
Public Sub Sobratj(Pervij As String, Vtoroj As String, Rezultat As String)
'обратная операция: фаил Pervij объединить с Vtoroj в Rezultat
End Sub
Всё что я делал, получается громоздко и запутано. Файлы будут длиной 4Гб.

Автор: bom 4.9.2007, 13:36
Цитата(kapbepucm @  4.9.2007,  15:33 Найти цитируемый пост)
Застрял на такой ерунде

Чего ж застрял, если ерунда?

Цитата(kapbepucm @  4.9.2007,  15:33 Найти цитируемый пост)
Всё что я делал, получается громоздко и запутано.

А ты делай красиво и оптимально smile

Что конкретно вызывает затруднение? Не мешало бы привести здесь свои наработки чтобы получить помощь.

Автор: Akina 4.9.2007, 14:34
Где плоды своей работы? без них тема - кандидат на вылет в "Поиск специалистов".

Автор: kapbepucm 4.9.2007, 15:16
Вот, чем сей-час пользуюсь:
Код
Public Sub Razbit(IshodnijFail As String, Pervij As String, DlinaPervogo As Long, Vtoroj As String)
  Open IshodnijFail For Random As #3 Len = 1
  Open Pervij For Random As #1 Len = 1
  Open Vtoroj For Random As #2 Len = 1
  Dim Buf As Byte
  Dim I As Long
  For I = 1 To DlinaPervogo
    Get #3, I, Buf
    Put #1, I, Buf
  Next I
  For I = DlinaPervogo + 1 To FileLen(IshodnijFail)
    Get #3, I, Buf
    Put #2, I - DlinaPervogo, Buf
  Next I
  Close #1
  Close #2
  Close #3
End Sub
Public Sub Sobratj(Pervij As String, Vtoroj As String, Rezultat As String)
  Open Pervij For Random As #1 Len = 1
  Open Vtoroj For Random As #2 Len = 1
  Open Rezultat For Random As #3 Len = 1
  Dim Buf As Byte
  Dim I As Long
  For I = 1 To FileLen(Pervij)
    Get #1, I, Buf
    Put #3, I, Buf
  Next I
  Dim DlinaPervogo As Long
  DlinaPervogo = FileLen(Pervij)
  For I = 1 To FileLen(Vtoroj)
    Get #2, I, Buf
    Put #3, I + DlinaPervogo, Buf
  Next I
  Close #1
  Close #2
  Close #3
End Sub
Видимо 4Гб придётся разбивать не один час smile

Автор: Akina 4.9.2007, 16:51
Следует использовать потоковое чтение сразу нужного объема информации (см. Open For Binary - Get) или, если DlinaPervogo велика - кластеризовать чтение начала.
Но еще разумнее выполнить операцию через FileSystemObject.

Автор: admsasha 4.9.2007, 17:07
Я бы сделал так копирование, из этого примера думаю, додумаешь. Если нет, напишу полный вариант.
700Mb скопировался за 30 секунд

Код

Private Const maxBuf = 36000

Public Sub Razbit(IshodijFail As String, Pervij As String, DlinaPervogo As Long, Vtoroj As String)
   Dim Byte1 As String * maxBuf
   Dim Byte2 As Byte
   Dim i As Long
   Open IshodijFail For Binary As 1
   
   Open Pervij For Binary As 2
      For i = 0 To Int(DlinaPervogo / maxBuf) - 1
         Get #1, (i * maxBuf) + 1, Byte1
         Put #2, (i * maxBuf) + 1, Byte1
      Next i
      For i = Int(DlinaPervogo / maxBuf) * maxBuf To DlinaPervogo
         Get #1, i, Byte2
         Put #2, i, Byte2
      Next i
      
   Close 2
   Close 1
End Sub

Автор: Akina 4.9.2007, 17:42
admsasha, как раз пример кластеризации чтения. Только размер буфера следовало бы выбирать кратным размеру кластера файловой системы (при использовании fixed length string разумно использовать 32 или 64 кб) - это несколько снижает накладные расходы на выполнение операций.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)