Как узнать размер любого файла?

NoRoV

Есть-ли какая-нибудь функция, чтобы имея полный путь до файла и его имя можно было-бы узнать его размер? В А97 (Win98) такой функции я не нашел, может, кто подскажет API функцию с примером? Заранее спасибо
15 ответов

NoRoV

Declare Function lopen Lib <b>"kernel32"</b> Alias <b>"_lopen"</b> (ByVal lpPathName As String, ByVal iReadWrite As Long) As Long
Declare Function GetFileSize Lib <b>"kernel32"</b> (ByVal hFile As Long, lpFileSizeHigh As Long) As Long
Const OF_READ = &H0
Const OF_SHARE_COMPAT = &H0
Function file_size(ByVal file_name$) As Long
 Dim hFile&
hFile = lopen(file_name, OF_SHARE_COMPAT + OF_READ)
 file_size = GetFileSize(hFile, <b>0</b>&)
End Function
Но учти, что в Long всего поместится 4294967295 байт.


NoRoV

? VBA.Filelen ("C:\boot.ini")


NoRoV

Несколько меньше: 4 байта. :^)))


NoRoV

2 Владимир Саныч исправляюсь: в Long поместится длина файла не большая, чем 4294967295 байт.


NoRoV

Тогда 2147483647. :^)


NoRoV

Ну.. Уж с битом котрый "отщипывается" под знак, можно справиться. ;-)


NoRoV

Как?


NoRoV

Можно написать класс для работы с большими числами, а можно и воспользваться теми же WIN API например wsprintf, которая вернёт длину строки в текстовом формате. Если интересно, могу написать.


NoRoV

И это поможет занести 4294967295 в Long? Или все-таки в переменную другого типа?


NoRoV

исправляю мой предыдущий пост: Можно написать класс для работы с большими числами, а можно и воспользваться теми же WIN API например wsprintf, которая вернёт длину файла в текстовом формате. Если интересно, могу написать. Блин, совсем забыл, что в VBA есть тип Currency тогда и никакие классы писать не нужно, а тем более использовать WIN API 2 Владимир Саныч
sub unsigned_long()
 dim ul&
 dim c@
ul = -<b>1</b> ' присваиваю значение <b>4294967295</b> ;<b>0</b>)
 с = <b>4294967296</b>
 c = c + ul
 Debug.Print c
End Sub


NoRoV

Но ведь c@ - это не Long. Или это шутка?


NoRoV

А все-таки как узнать размер файла, который более 5 гигов?


NoRoV

не уверен (да и проверить не на чем)
Function ShowFileSize(filespec)
 Dim fso, f, s
 Set fso = CreateObject("Scripting.FileSystemObject")
 Set f = fso.GetFile(filespec)
 ShowFileSize = f.size 
End Function


NoRoV

Ну.. Уж с битом котрый "отщипывается" под знак, можно справиться. ;-)
Как?
в смысле отображения пользователю полученных лонгов со значениями между двумя и тремя гигами, должна помочь такого сорта функция
Private Type longType
 longValue As Long
End Type

Private Type FourByte
 Byte1 As Byte
 byte2 As Byte
 byte3 As Byte
 byte4 As Byte
End Type

Function longToCurr(lVal As Long) As Currency
 Dim lpv As FourByte, lvv As longType
 
 lvv.longValue = lVal
 LSet lpv = lvv
 longToCurr = lpv.Byte1 * <b>1</b>@
 longToCurr = longToCurr + lpv.byte2 * <b>256</b>@
 longToCurr = longToCurr + lpv.byte3 * <b>65536</b>@
 longToCurr = longToCurr + lpv.byte4 * <b>16777216</b>@
End Function
в смысле арифметики - что-то такое (взято с вбакселератора)
Private Function UnsignedAdd(Start As Long, Incr As Long) As Long
' This function is useful when doing pointer arithmetic,
' but note it only works for positive values of Incr

 If Start And &H80000000 Then 'Start < 0
 UnsignedAdd = Start + Incr
 ElseIf (Start Or &H80000000) < -Incr Then
 UnsignedAdd = Start + Incr
 Else
 UnsignedAdd = (Start + &H80000000) + (Incr + &H80000000)
 End If

End Function


NoRoV

ох
между двумя и тремя гигами
= между 2-мя и 4-мя.