PDA

View Full Version : بدست آوردن اندازه فایل



omidan321
شنبه 09 دی 1391, 13:28 عصر
سلام به همگی در ادامه مطالب قبلی میخام اندازه(سایز) فایلی که کاربر انتخاب کرده رو بدست بیارم کسی متونه راهنمایی کنه ؟

بهروز عباسی
شنبه 09 دی 1391, 13:45 عصر
function StrFormatByteSize(dw: int64; szBuf: pansichar; uiBufSize: UINT)
: pansichar; stdcall; external 'shlwapi.dll' name 'StrFormatByteSize64A';

implementation

{$R *.dfm}

function FileSizeToStr(SizeInBytes: int64): string;
var
arrSize: array [0 .. 255] of AnsiChar;
begin
StrFormatByteSize(SizeInBytes, arrSize, Length(arrSize) - 1);
SetString(Result, pansichar(@arrSize[0]), sizeof(arrSize));
end;

function FileSize(const aFilename: String): int64;
var
info: TWin32FileAttributeData;
begin
Result := -1;

if NOT GetFileAttributesEx(PWideChar(aFilename), GetFileExInfoStandard, @info)
then
EXIT;

Result := info.nFileSizeLow or (info.nFileSizeHigh shl 32);
end;
// Example of use...
procedure TForm1.FormCreate(Sender: TObject);
begin
ShowMessage(FileSizeToStr(FileSize(ParamStr(0))))
end;

موفق باشید

omidan321
شنبه 09 دی 1391, 13:50 عصر
اگه فرصت داری میتونی بگی
function FileSizeToStr(SizeInBytes: int64): string;
با این تابع
function FileSize(const aFilename: String): int64;
تفاوتی داره یا نه ؟

Felony
شنبه 09 دی 1391, 17:08 عصر
var
aFile: TFileStream;
begin
aFile := TFileStream.Create('Filename', fmOpenRead);
try
ShowMessage(IntToStr(aFile.Size));
finally
aFile.Free;
end;
end;

یا


var
aFile: TMemoryStream;
begin
aFile := TMemoryStream.Create;
try
aFile.LoadFromFile('');
ShowMessage(IntToStr(aFile.Size));
finally
aFile.Free;
end;
end;

بهروز عباسی
یک شنبه 10 دی 1391, 10:09 صبح
اگه فرصت داری میتونی بگی
function FileSizeToStr(SizeInBytes: int64): string;
با این تابع
function FileSize(const aFilename: String): int64;
تفاوتی داره یا نه ؟

این تابع
function FileSizeToStr(SizeInBytes: int64): string;
مقدار int64 تابع زیرو رو با یک فرمت مخصوص حجم رو برمیگردونه
function FileSize(const aFilename: String): int64;
مثلاً : KB 12 یا ...

تابع اصلی که حجم فایل رو بدست میاره اینه
function FileSize(const aFilename: String): int64;
موفق باشید

Mask
چهارشنبه 18 بهمن 1391, 20:58 عصر
var
aFile: TFileStream;
begin
aFile := TFileStream.Create('Filename', fmOpenRead);
try
ShowMessage(IntToStr(aFile.Size));
finally
aFile.Free;
end;
end;

یا


var
aFile: TMemoryStream;
begin
aFile := TMemoryStream.Create;
try
aFile.LoadFromFile('');
ShowMessage(IntToStr(aFile.Size));
finally
aFile.Free;
end;
end;
یه نکته جالب :
چرا TMemoryStream برای یه فایل که حدود 4 گیگه جواب نمیده.؟
با اینکه نوشته :
property Size: Int64 read GetSize write SetSize64
علت؟

Felony
شنبه 05 اسفند 1391, 10:55 صبح
اینو تاپیکو ندیده بودم ؛
خوب سیستم عامل 32 بیتی نمیتونه بیشتر از 4 گیگ رو آدرس دهی کنه ...

Mask
شنبه 05 اسفند 1391, 12:40 عصر
خوب سیستم عامل 32 بیتی نمیتونه بیشتر از 4 گیگ رو آدرس دهی کنه ..
مبارک باشه:لبخند:
اتفاقا ویندوز من 64 بیتیه.

Felony
شنبه 05 اسفند 1391, 13:16 عصر
...what the f

من اشتباه کردم ، کلا موضوع رو بد متوجه شدم ...

تو متدهای TMemoryStream متد LoadFromStream رو ببینید :


procedure TMemoryStream.LoadFromStream(Stream: TStream);
var
Count: Longint;
begin
Stream.Position := 0;
Count := Stream.Size;
SetSize(Count);
if Count <> 0 then Stream.ReadBuffer(FMemory^, Count);
end;

دقیقا دیتا در اون خط Count:= Stream.Size خراب میشه .

:)

Mask
شنبه 05 اسفند 1391, 13:52 عصر
یعنی اگه اون Longint رو تبدیل به Int64 کنیم مشکل حل میشه.

Ananas
شنبه 05 اسفند 1391, 14:32 عصر
آقا این TMemoryStream داره فایل رو لود میکنه روی رم. چرا این کار رو کنیم؟ شما میگی فایل 4 گیگ. من یک ویدئوی 17 گیگ دارم که اصلا روی رم لود نمیشه. سوالی که پرسیدن نخواستن فایل رو باز کنن فقط حجمش رو می خوان بدونن.

khoshblagh
شنبه 30 خرداد 1394, 10:22 صبح
function StrFormatByteSize(dw: int64; szBuf: pansichar; uiBufSize: UINT)
: pansichar; stdcall; external 'shlwapi.dll' name 'StrFormatByteSize64A';

implementation

{$R *.dfm}

function FileSizeToStr(SizeInBytes: int64): string;
var
arrSize: array [0 .. 255] of AnsiChar;
begin
StrFormatByteSize(SizeInBytes, arrSize, Length(arrSize) - 1);
SetString(Result, pansichar(@arrSize[0]), sizeof(arrSize));
end;

function FileSize(const aFilename: String): int64;
var
info: TWin32FileAttributeData;
begin
Result := -1;

if NOT GetFileAttributesEx(PWideChar(aFilename), GetFileExInfoStandard, @info)
then
EXIT;

Result := info.nFileSizeLow or (info.nFileSizeHigh shl 32);
end;
// Example of use...
procedure TForm1.FormCreate(Sender: TObject);
begin
ShowMessage(FileSizeToStr(FileSize(ParamStr(0))))
end;

موفق باشید

با سلام خدمت دوستان
من اسم فایل را چطوری به این تابع بدهم. البته با استفاده از openDialog ؟ متشکرم