سلام
اگر با استفاده از FSO و زير شاخه هاي آن حجم فايلي را دريافت كنيم در صورتي كه حجم فايل به چند گيگابايت برسد پيغام خطاي overfollow نمايش داده مي شود. چه راهي پيشنهاد مي كنيد؟
تا حالا فايلي تا اين اندازه سنگين باهاش باز نكردم ولي از اونجائي كه حجم فايل رو به بايت مي ده خوب تقريبا چندگيگابايت رو نمي شه تو هر متغييري جا داد. شايد بهتر باشه از انواع ديگه اي از متغيير عددي استفاده كني يا مستقيما اون رو با دستور Cstr تبديل به استرينگش كني.
سلام.
من فایل چند گیگی دیدم.
یادمه چند سال پیش برای این که وقتم سر وین ریختن و نصب برنامه ها تلف نشه از فولدرهای ویندوز و پروگرم فایلز و ... یه کپی گرفتم و بعد همه رو rar کردم. با اون همه برنامه که نصب بود حجم فایل rar به چند گیگ رسید. بعد هر دفعه فایل رو اکسترکت میکردم و با استفاده از safe mode و روش های دیگه که درست یادم نیست تو 5 دقیقه وین رو نصب میکردم. ولی بعدا روش ایمیج گرفتن اومد که کار رو ساده تر کرد.
شما حجم رو بر اساس بایت که نمیخوای مسلما. حجم رو 3 بار تقسیم بر 1024 کن تا به گیگ تبدیل شه. بعد بریز تو متغیر.
فایل رو بصورت binary باز کن
یه متغیر از نوع String تعریف کن
توش یه مقدار مشخص space بنداز. مثلا 1000 تا
بعد از اون فایل داده ها رو بگیر بریز تو این متغیر.
چند بار این رو تو حلقه تکرار کن تا کل داده ها رو بگیری. اینطوری میفهمی چند بایته . . .
برای دقت بیشتر می تونی از trim هم استفاده کنی تا تو آخریش space اضافه نیاد.
ممنون از پاسخ هاتون
آقاي Di Di : شما وقتكي كه از يك DVD ، تصوير(Image) مي گيريد حجم فايل چقدر مي شه؟
payman62: برنامه قادر به گرفتن حجم فايل نيست و اصلا كار به جايي نمي كشه كه ما بخوايم تقسيم بر 1000*1000 كنيم! مي تونيد امتحان كنيد.
spiderman: من مي خوام با FSO حجم رو بگيرم.
سلام.
حتما باید fso باشه؟
filelen چطور؟
Function FileLen(PathName As String) As Long
مقدار برگشتیش Long هست. اگه بیشتر 2 میلیارد و خورده ای بشه ارور میده. تا حدود 2 گیگ جا داره.
میتونی نیمه اول فایل رو بخونی حجمشو بگیری بعد نیمه دومش رو بخونی حجم اونم بگیری. هر کدوم رو به گیگ تبدیل کنی و جمع کنی.
شما راهي با FSO نمي دونيد؟
در ضمن منظورتون از نيمه اول و دوم فايل چيه؟ با filelen() مگه مي شه حجم فايل رو در چند مرحله گرفت؟ يا منظور شما با استفاده از Get بود؟
VB.NET. اندازه long اونجا 46 بیته.
سلام
خوب هستيد
با fso نميشه اندازه فايل هاي بزرگ رو گرفت . با File len هم تا 4294967295 رو مي توني بدست بياوري .
نكته چون ما اعداد منفي توي اندازه فايل نداريم عدد long بدون علامت توسط filelen بر گردانده ميشود . اما اعدد بدست امده هنگام نمايش علامت دار نمايش داده ميشن پس براي فايل هاي با حجم بين 2,147,483,647 و 4,294,967,295 سايز فايل منفي نشون داده مي شه .
اما ميشه از كد زير براي همه نوع فايل استفاده كرد براي اين كار يك پروژه استاندارد باز كنيد و كد زير رو توش كپي پيست كنيد
کد:
Private Const OPEN_EXISTING = 3
Private Type FILETIME
dwLowDateTime As Long
dwHighDateTime As Long
End Type
Private Type BY_HANDLE_FILE_INFORMATION
dwFileAttributes As Long
ftCreationTime As FILETIME
ftLastAccessTime As FILETIME
ftLastWriteTime As FILETIME
dwVolumeSerialNumber As Long
nFileSizeHigh As Long
nFileSizeLow As Long
nNumberOfLinks As Long
nFileIndexHigh As Long
nFileIndexLow As Long
End Type
Private Declare Function GetFileInformationByHandle Lib "kernel32" (ByVal hFile As Long, lpFileInformation As BY_HANDLE_FILE_INFORMATION) As Long
Private 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
Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
Private Sub Form_Load()
MsgBox GetFileSize("xxxx")
End Sub
Function GetFileSize(strPath As String) As Double
Dim hFile As Long, FileInfo As BY_HANDLE_FILE_INFORMATION
GetFileSize = -1
' Check if file exist
If Dir(strPath) = "" Then Exit Function
' Create handle for strpath file
hFile = CreateFile(strPath, 0, 0, ByVal 0&, OPEN_EXISTING, 0, ByVal 0&)
'retrieve the file information
GetFileInformationByHandle hFile, FileInfo
'close the handle
CloseHandle hFile
'convert the result fo no sign long & add high order size and Low order size
GetFileSize = ValNoSin(FileInfo.nFileSizeHigh) * ValNoSin(&HFFFFFFFF) + ValNoSin(FileInfo.nFileSizeLow)
End Function
Function ValNoSin(el As Long) As Double
Dim elhex As String
Dim dblDum As Double
Dim bytAsc As Byte
dblDum = 0
' convert it to hex
elhex = UCase(Hex(el))
' now with out craying sign bit convert it to decimal base
For i = 1 To Len(elhex)
bytAsc = Asc(Mid(elhex, i, 1)) - 48
If bytAsc > 10 Then _
bytAsc = bytAsc - 7
dblDum = dblDum * 16 + bytAsc
Next
ValNoSin = dblDum
End Function
بحاي فايل فرستاده شده كه xxxx است مسير فايل خودتون رو بگذاريد
به اميد ديدار