!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
Не хотелось бы полностью менять, таких похожих кодов в программе около десятка.
Во блин пока писал еще ответы появились.
tyomitch писал(а):Таки-да, ReadFile и WriteFile. Только OVERLAPPED не при чём.
Не совсем согласен, при асихронном вводе-выводе используется структура OVERLAPPED, определяющая точку начала чтения, хотя это можно заменить на API функцию SetFilePointer которая так-же устанавливает начальную точку чтения.
Antonariy писал(а): максимальное значение Currency 922,337,203,685,477.5807 - это примерно 858993 тб. Сомневаюсь, что даже такие хранилища существуют, не то что файлы.
Хорошо тогда подскажи мне тип переменной в VB6 который можно использовать для работы с файлами более 2-х Гб