Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

RFpro.ru: Программирование на Basic / VBA


Хостинг портала RFpro.ru:
Московский хостер
Профессиональный платный хостинг на базе Windows 2008

РАССЫЛКИ ПОРТАЛА RFPRO.RU

Чемпионы рейтинга экспертов в этой рассылке

Тимошенко Дмитрий
Статус: Студент
Рейтинг: 309
∙ повысить рейтинг >>
Чичерин Вадим Викторович
Статус: 10-й класс
Рейтинг: 165
∙ повысить рейтинг >>
Botsman
Статус: Специалист
Рейтинг: 143
∙ повысить рейтинг >>

∙ / КОМПЬЮТЕРЫ И ПО / Языки программирования / Basic/VBA

Выпуск № 909 от 07.07.2009, 20:05
Администратор рассылки: Калашников О.А., Руководитель
В рассылке: подписчиков - 360, экспертов - 88
В номере: вопросов - 1, ответов - 1

Нам очень важно Ваше мнение об этом выпуске рассылки. Вы можете оценить этот выпуск по пятибалльной шкале, пройдя по ссылке:
оценить выпуск >>

Вопрос № 170105: Здравствуйте! Мне необходимо написать программу, которая будет "сливать" два файла, т.е. копировать содержимое одного файла в другой. Для проверки корректности передачи пробовал копировать содержимое одного файла в пустой файл. У м...



Вопрос № 170105:

Здравствуйте!
Мне необходимо написать программу, которая будет "сливать" два файла, т.е. копировать содержимое одного файла в другой.
Для проверки корректности передачи пробовал копировать содержимое одного файла в пустой файл.
У меня это получилось, но все время получается так, что у меня копируются "лишние" байты, т.е. если копировать содержимое одного файла в другой пустой файл, то размер файла, куда мы копировали, превышает размер исходного файла на несколько байт. Как выяснилось, это связано с тем, какими объемами мы берем информацию из исходного файла, но даже, если брать по байту, то получится, что размер файла, куда мы писали, будет на байт больше того, из которого писали. Язык программирования: Visual Basic 6.
Вот код моей программы, никаких объектов на форме нет:

Private Sub Form_Load()
Dim MyF, MyFF
Dim A(1023) As Byte
Dim L As Long
L = FileLen(App.Path & "\1.bmp") + 1
MyF = FreeFile
Open App.Pat h & "\1.bmp" For Binary As #MyF
MyFF = FreeFile
Open App.Path & "\2.bmp" For Binary As #MyFF
Do Until EOF(MyFF)
Get #MyFF, , A
Put #MyF, L, A
L = L + 1024
Loop
Close #MyF
Close #MyFF
MsgBox "Готово!!", vbInformation, "Готово!"
End
End Sub

Большое спасибо!

Отправлен: 02.07.2009, 19:54
Вопрос задал: AkaProc, 4-й класс
Всего ответов: 1
Страница вопроса >>


Отвечает HookEst, Специалист :
Здравствуйте, AkaProc.
PsySex уже все рассказал, дополню:

Для не очень больших файлов, вполне допустимо сразу делать буфер размером с файл:
Код:

Sub AppendSmall(ByVal srcPath As String, ByVal dstPath As String)
Dim src As Integer
Dim dst As Integer
Dim buf() As Byte

If FileLen(srcPath) = 0 Then Exit Sub

src = FreeFile
Open srcPath For Binary Access Read Lock Read As #src
ReDim buf(LOF(src) - 1)
Get src, , buf
Close #src

dst = FreeFile
Open dstPath For Binary Access Write Lock Write As #dst
Put #dst, LOF(dst) + 1, buf
Close #dst

End Sub


Для файлов побольше(максимальный размер файлов все равно ограничен ма ксимальным значением Long ~2Gb), одноразовым чтением уже не обойдемся:
Код:

Const DEFAULT_BUFSIZE = 4096

Function Min(ByVal a As Long, ByVal b As Long) As Long
If a < b Then Min = a Else Min = b
End Function

Sub AppendBig(ByVal srcPath As String, ByVal dstPath As String, Optional ByVal bufSize As Long = DEFAULT_BUFSIZE)
Dim src As Integer
Dim dst As Integer
Dim buf() As Byte
Dim srcSize As Long
If FileLen(srcPath) = 0 Then Exit Sub

src = FreeFile
Open srcPath For Binary Access Read Lock Read As #src
srcSize = LOF(src)

dst = FreeFile
Open dstPath For Binary Access Write Lock Write As #dst
Seek #dst, LOF(dst) + 1

If bufSize <= 0 Then bufSize = DEFAULT_BUFSIZE
bufSize = Min(bufSize, srcSize)
Do
ReDim buf(bufSize - 1)
Get #src, , buf
Put #dst, , buf
bufSize = Min(bufSize, srcSize - Loc(src))
Loop While bufSize > 0

Close #src
Close #dst

End Sub


Успехов.

Ответ отправил: HookEst, Специалист
Ответ отправлен: 03.07.2009, 06:15

Как сказать этому эксперту "спасибо"?
  • Отправить SMS #thank 251786 на номер 1151 (Россия) | Еще номера >>
  • Отправить WebMoney:
  • Вам помогли? Пожалуйста, поблагодарите эксперта за это!



    Нам очень важно Ваше мнение об этом выпуске рассылки. Вы можете оценить этот выпуск по пятибалльной шкале, пройдя по ссылке:
    оценить выпуск >>

    подать вопрос экспертам этой рассылки >>

    Скажите "спасибо" эксперту, который помог Вам!

    Отправьте СМС-сообщение с тестом #thank НОМЕР_ОТВЕТА
    на короткий номер 1151 (Россия)

    Номер ответа и конкретный текст СМС указан внизу каждого ответа.

    Полный список номеров >>

    * Стоимость одного СМС-сообщения от 7.15 руб. и зависит от оператора сотовой связи. (полный список тарифов)
    ** При ошибочном вводе номера ответа или текста #thank услуга считается оказанной, денежные средства не возвращаются.
    *** Сумма выплаты эксперту-автору ответа расчитывается из суммы перечислений на портал от биллинговой компании.


    © 2001-2009, Портал RFpro.ru, Россия
    Авторское право: ООО "Мастер-Эксперт Про"
    Автор: Калашников О.А. | Программирование: Гладенюк А.Г.
    Хостинг: Компания "Московский хостер"
    Версия системы: 2009.6.3 от 20.06.2009

    В избранное