PDA

View Full Version : مشکل در دستور AssignFile



loo30fer
پنج شنبه 02 دی 1389, 11:55 صبح
با سلام خدمت دوستان
من تو دستور AssignFile به مشکل برخوردم که باهاش نمیتونم حجم فایلهای قفل شده رو بگیرم ممنون میشم کمکم کنید از این دستورم استفاده میکنم :


var
f : File of byte;
fs : cardinal;
begin
AssignFile(f,'C:\DOCUME~1\Loo30fer\LOCALS~1\Temp\M MBPlayer\UFMate.dll');
Reset(F);
fs := system.FileSize(f);
Edit1.Text:=Inttostr(fs);
CloseFile(f);

vcldeveloper
پنج شنبه 02 دی 1389, 19:14 عصر
فایلی که قفل باشه رو AssignFile نمیتونه باز کنه.

می تونید از کد زیر استفاده کنید:


function GetFileSizeEx(hFile: THandle; lpFileSize: PLargeInteger): BOOL; stdcall external kernel32 name 'GetFileSizeEx';

function SizeOfFile(const FileName: string): Int64;
var
Size : TLargeInteger;
hFile : THandle;
begin
Result := -1;
hFile := CreateFile(PChar(FileName), //File name
0, //Access mode = query device access
FILE_SHARE_READ, //Share mode = just cuncurrent read is allowed
nil, //Security attribute = none
OPEN_EXISTING, //Creation mode= Open existing file
FILE_ATTRIBUTE_NORMAL, //Use normal attributes for the file
0); //Do not use any template file.
if hFile > 0 then
try
Win32Check(GetFileSizeEx(hFile,@Size));
Result := Size;
finally
CloseHandle(hFile);
end;
end;

اگر مطمئن هستید که اندازه فایل مورد نظرتون خیلی بزرگ نمیشه، مجبور نیستید از GetFileSizeEx استفاده کنید، به جاش می تونید از GetFileSize استفاده کنید، و اون تابع GetFileSizeEx رو هم تعریف نکنید.

Felony
پنج شنبه 02 دی 1389, 19:16 عصر
از TSearchRec استفاده کنید ، براتون یک تابع نوشتم :

function MyFileSize(const FileName: String): Int64;
var
SR: TSearchRec;
begin
if FindFirst(FileName, faAnyFile, SR)=0 then
repeat
Result:= SR.Size div 1024;
until (FindNext(SR)<> 0);
FindClose(SR);
end;

استفاده :

ShowMessage(IntToStr(MyFileSize('C:\pagefile.sys') ));

loo30fer
پنج شنبه 02 دی 1389, 23:39 عصر
ممنون

از TSearchRec استفاده کنید ، براتون یک تابع نوشتم :
کد:
function MyFileSize(const FileName: String): Int64;
var
SR: TSearchRec;
begin
if FindFirst(FileName, faAnyFile, SR)=0 then
repeat
Result:= IntToStr(SR.Size div 1024);
until (FindNext(SR)<> 0);
FindClose(SR);
end;
استفاده :
کد:
ShowMessage(IntToStr(MyFileSize('C:\pagefile.sys') ));

جناب تاجیک من کدتون رو داخل دکمه گذاشتم به این شکل :

procedure TForm1.Button1Click(Sender: TObject);
function MyFileSize(const FileName: String): Int64;
var
SR: TSearchRec;
begin
if FindFirst(FileName, faAnyFile, SR)=0 then
repeat
Result:= InttoStr(SR.Size div 1024);
until (FindNext(SR)<> 0);
FindClose(SR);
ShowMessage(InttoStr(MyFileSize('C:\pagefile.sys') ));
end;
ولی این قسمت رو خطا میگیره نمیدونم مشکل از کجاست

Result:= InttoStr(SR.Size div 1024);

شرمنده من مبتدی هستم اگه امکانم داره در مورد نحوه عملکرد دستور یه توضیحی بدین و این تابع با فایلهای با حجم خیلی بالا هم کار میکنه و حجم رو به بایت میگه یا کیلوبایت با تشکر

Felony
جمعه 03 دی 1389, 06:31 صبح
شرمنده من مبتدی هستم اگه امکانم داره در مورد نحوه عملکرد دستور یه توضیحی بدین و این تابع با فایلهای با حجم خیلی بالا هم کار میکنه و حجم رو به بایت میگه یا کیلوبایت با تشکر
اون کد یک تابع هست ، به اون شکل نباید ازش استفاده کنید ، هر جا به حجم فایلی نیاز داشتید اون تابع رو مثل نمونه قبلی صدا میزنید :


unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;

type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

function MyFileSize(const FileName: String): Int64;
var
SR: TSearchRec;
begin
if FindFirst(FileName, faAnyFile, SR)=0 then
repeat
Result:= SR.Size div 1024;
until (FindNext(SR)<> 0);
FindClose(SR);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
ShowMessage(IntToStr(MyFileSize('C:\pagefile.sys') ));
end;

end.

کد حجم رو به KB برمیگردونه ، اگر میخواین حجم رو به بایت برگردونه تو تابع قسمت div 1024 رو حذف کنید .
در مورد حجم فایل هم مشکلی نداره .