Эээ... максимальное значение Currency 922,337,203,685,477.5807 - это примерно 858993 тб. Сомневаюсь, что даже такие хранилища существуют, не то что файлы.переменные для определения позиции соответственно я буду использовать Currency
!Viper! писал(а):По идее номер читаемого/записываемого файла определяется значением типа Long, посему боюсь ничего не получиться
' Здесь переменные pos as Currency, dlFile as Currency
'filebytes1 -это динамический массив, размерность массива равна переменной sizebuffer, тип массива Byte
'Длинну файла получаю с помощью API функции
'Declare Function GetFileSizeEx Lib "kernel32" (ByVal hFile As Long, lpFileSizeHigh As Currensy) As Long
'вызов GetFileSizeEx fPointer,dlFile
'Отрывок кода востановления первоночальных данных
sizebuffer = 32768 'Устанавливаем значение буфера
GetFileSizeEx fPointer,dlFile
dlFile =dlFile - 128 'Отбрасываем свой заголовок и получаем истинный размер оригинала
ProgressBar1.Max = dlFile ' Устанавливаем прогресс
If dlFile < sizebuffer Then sizebuffer = dlFile 'Если длинна файла меньше чем буфер
ReDim filebytes1(sizebuffer - 1)
pos=1
filenum = FreeFile
Open out_File For Binary Access Read As filenum
filenum1 = FreeFile
Open out_patch + ffi1 For Binary Access Write As filenum1
Do
DoEvents 'На всякий случай что-бы не зависало
Get #filenum, pos + 128, filebytes1 ' читаем из файла
'... Здесь произвожу работу с прочтенными данными
Put #filenum1, pos, filebytes1 ' Записываю работу в другой файл
pos = pos + sizebuffer ' Устанавливаем следующую порцию из файла
If pos < dlFile Then ProgressBar1.Value = pos ' Заполняем прогресс
' Вычисляем прошедшее время
EndTime = Timer
sek = EndTime - StartTime: sek2 = sek
chas = Int(sek / 3600): min = Int(sek / 60) - (chas * 60)
sek = sek - (chas * 60 + min) * 60
Form8.Label5.Caption = Format(Str$(chas) + ":" + Str$(min) + ":" + Str$(sek), "hh:mm:ss")
'Вычисляем оставшееся время
If (dlFile / pos) > 10 Then
Form8.Label7.Caption = "Время вычисляется."
Else
If vvn >= 8 Then
sek1 = Int((dlFile / pos) * sek2): sek1 = sek1 - sek2
chas1 = Int(sek1 / 3600): min1 = Int(sek1 / 60) - (chas1 * 60)
sek1 = sek1 - (chas1 * 60 + min1) * 60: vvn = 0
Form8.Label7.Caption = Format(Str$(chas1) + ":" + Str$(min1) + ":" + Str$(sek1), "hh:mm:ss")
Else
vvn = vvn + 1 ' Что-бы цыфры времени не слишком бысро обновлялись делаем небольшую задержку
End If
End If
If sto = 1 Then ' Если была нажата кнопка отмена
If MsgBox("Прервать выполнение?", vbQuestion + vbYesNo, "Внимание.") = vbYes Then
Close filenum1 ' Закрываем файл для записи
Close filenum 'Закрываем файл для чтения
Kill out_patch + ffi1 ' Удаляем незавершенный файл
Unload Me ' Выгружаемся
Exit Sub
End If
End If
Loop Until (pos + sizebuffer) > dlFile ' Если подошли к концу файла то выходим из цыкла
If pos = dlFile + 1 Then GoTo en ' Если все-же был достигнут конец файла то завершаемся
sizebuffer = dlFile - pos ' Изменяем буфер равный остатку
ReDim filebytes1(sizebuffer) ' Изменяем массив
Get #filenum, pos + 128, filebytes1 ' Читаем остатки
'... Здесь произвожу работу с прочтенными данными
Put #filenum1, pos, filebytes1 ' Записываем остатки
en:
Close filenum1 ' Все закрываем
Close filenum
Не совсем согласен, при асихронном вводе-выводе используется структура OVERLAPPED, определяющая точку начала чтения, хотя это можно заменить на API функцию SetFilePointer которая так-же устанавливает начальную точку чтения.tyomitch писал(а):Таки-да, ReadFile и WriteFile. Только OVERLAPPED не при чём.
Хорошо тогда подскажи мне тип переменной в VB6 который можно использовать для работы с файлами более 2-х ГбAntonariy писал(а): максимальное значение Currency 922,337,203,685,477.5807 - это примерно 858993 тб. Сомневаюсь, что даже такие хранилища существуют, не то что файлы.
Glyckmen писал(а):Не совсем согласен, при асихронном вводе-выводе используется структура OVERLAPPED, определяющая точку начала чтенияtyomitch писал(а):Таки-да, ReadFile и WriteFile. Только OVERLAPPED не при чём.
А я знаю что его с лихвой хватит, но только ты своим выражениемА Currency недостаточно?
Подверг сомнению мой выбор Currency, вот я и написал что может быть есть другой тип о котором я и не догадывался.Antonariy писал(а):Сомневаюсь, что даже такие хранилища существуют, не то что файлы.
Antonariy писал(а):Put и Get это обертки для соответствующих апишек, так что по идее должны.
'*******************Объявление функция для работы с файлами******************
Declare Function CreateFile Lib "kernel32" Alias "CreateFileA" (ByVal lpFileName As String, ByVal dwDesiredAccess As Long, ByVal dwShareMode As Long, lpSecurityAttributes As Any, ByVal dwCreationDisposition As Long, ByVal dwFlagsAndAttributes As Long, ByVal hTemplateFile As Long) As Long
Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
Declare Function ReadFile Lib "kernel32" (ByVal hFile As Long, lpBuffer As Any, ByVal nNumberOfBytesToRead As Long, lpNumberOfBytesRead As Long, lpOverlapped As Any) As Long
Declare Function SetFilePointer Lib "kernel32" (ByVal hFile As Long, ByVal lDistanceToMove As Long, lpDistanceToMoveHigh As Long, ByVal dwMoveMethod As Long) As Long
Declare Function GetFileSizeEx Lib "kernel32" (ByVal hFile As Long, lpFileSizeHigh As Currency) As Long
Declare Function WriteFile Lib "kernel32" (ByVal hFile As Long, lpBuffer As Any, ByVal nNumberOfBytesToWrite As Long, lpNumberOfBytesWritten As Long, lpOverlapped As Any) As Long
'************************Объявление констант для работы с файлами**********
Public Const GENERIC_READ = &H80000000
Public Const GENERIC_WRITE = &H40000000
Public Const FILE_SHARE_READ = &H1
Public Const FILE_SHARE_WRITE = &H2
Public Const CREATE_NEW = 1
Public Const CREATE_ALWAYS = 2
Public Const OPEN_ALWAYS = 4
Public Const OPEN_EXISTING = 3
Public Const TRUNCATE_EXISTING = 5
Public Const FILE_ATTRIBUTE_ARCHIVE = &H20
Public Const FILE_ATTRIBUTE_HIDDEN = &H2
Public Const FILE_ATTRIBUTE_NORMAL = &H80
Public Const FILE_ATTRIBUTE_READONLY = &H1
Public Const FILE_ATTRIBUTE_SYSTEM = &H4
Public Const FILE_FLAG_DELETE_ON_CLOSE = &H4000000
Public Const FILE_FLAG_NO_BUFFERING = &H20000000
'В начале процедуры объявляются все необходимые переменные для работы
Dim filebytes1() As Byte 'Динамический массив
hFile = CreateFile(out_File, GENERIC_READ, FILE_SHARE_READ, ByVal CLng(0), OPEN_EXISTING, FILE_ATTRIBUTE_ARCHIVE, 0)
If hFile = -1 Then
MsgBox "Немогу открыть файл.", vbCritical + vbOKOnly, "Ошибка!"
Exit Sub ' Выход из процедуры
End If
GetFileSizeEx hFile, dlFile 'Определяем размер файла
dlFile = dlFile * 10000 'Сдвигаем запятую
ProgressBar1.Max = dlFile 'Устанавливаем прогресс
If dlFile < sizebuffer Then sizebuffer = dlFile 'Если буфер больше чем длинна файла то приравниваем буфер длинне
ReDim filebytes1(sizebuffer - 1) 'Изменяем размер массива
If SfxCrypt = True Then 'Устанавливаем имя получаемого файла
writfil = out_patch + ffi2 + ".exe"
Else
writfil = out_patch + ffi2 + ".crc"
End If
'Открываем файл для записи (файл уже создан)
hFile1 = CreateFile(writfil, GENERIC_WRITE, FILE_SHARE_READ, ByVal CLng(0), CREATE_ALWAYS, FILE_ATTRIBUTE_ARCHIVE, ByVal CLng(0))
SetFilePointer hFile1, 0, highbyte, FILE_END 'Устанавливаем указатель в конец получаемого файла (мы его будем дописывать)
Do ' Начало цикла
DoEvents ' На всякий случай что-бы не зависало
retval = ReadFile(hFile, filebytes1, sizebuffer, numread, ByVal CLng(0)) ' Читаем часть файла в массив filebytes1
RC4 filebytes1, cod 'Шифруем часть файла
retval = WriteFile(hFile1, filebytes1, sizebuffer, numread, ByVal CLng(0)) 'Записываем зашифрованное в файл
' Дальше код не имеет значения
retval = ReadFile(hFile, filebytes1, sizebuffer, numread, ByVal CLng(0)) ' Читаем часть файла в массив filebytes1
Остальные значения LONG!Viper! писал(а):И вдогонку, а какой тип у остальных передаваемых в функцию значений?
Сейчас этот форум просматривают: Google-бот, Mail.ru [бот], Majestic-12 [Bot] и гости: 14