Выпуск № 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
Отвечает 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 (Россия) |
Еще номера >>
Вам помогли? Пожалуйста, поблагодарите эксперта за это!
Нам очень важно Ваше мнение об этом выпуске рассылки. Вы можете оценить этот выпуск по пятибалльной шкале, пройдя по ссылке: оценить выпуск >>
* Стоимость одного СМС-сообщения от 7.15 руб. и зависит от оператора сотовой связи.
(полный список тарифов)
** При ошибочном вводе номера ответа или текста #thank услуга считается оказанной, денежные средства не возвращаются.
*** Сумма выплаты эксперту-автору ответа расчитывается из суммы перечислений на портал от биллинговой компании.