الحصول على التطبيق exe الحجم بسهولة
سؤال
هل هناك طريقة في دلفي للحصول على currect على تطبيق exe الحجم في واحد أو سطرين من الكود ؟
المحلول
ولمجرد التكشير ... يمكنك أيضا القيام بذلك مع تيارات فقط ما يزيد قليلا عن 2 خطوط من التعليمات البرمجية. عموما يتم تخزين اسم التطبيق بما في ذلك المسار أيضا إلى Paramstr (0).
var
fs : tFilestream;
begin
fs := tFilestream.create(paramstr(0),fmOpenRead or fmShareDenyNone);
try
result := fs.size;
finally
fs.free;
end;
end;
نصائح أخرى
وانها ليست صغيرة كما تريد، لكنه لا يحتاج إلى مقابض. أنا استخدم هذا في كل ما عندي من مأرشف "SFX" والبرامج التي يجب أن تعرف حجمها. IIRC أنها تتطلب وحدة ويندوز.
function GetExeSize: cardinal; var p: pchar; i, NumSections: integer; const IMAGE_PE_SIGNATURE = $00004550; begin result := 0; p := pointer(hinstance); inc(p, PImageDosHeader(p)._lfanew + sizeof(dword)); NumSections := PImageFileHeader(p).NumberOfSections; inc(p,sizeof(TImageFileHeader)+ sizeof(TImageOptionalHeader)); for i := 1 to NumSections do begin with PImageSectionHeader(p)^ do if PointerToRawData+SizeOfRawData > result then result := PointerToRawData+SizeOfRawData; inc(p, sizeof(TImageSectionHeader)); end; end;
لمصلحة التوافق في المستقبل، يجب عليك أن تختار التنفيذ التي لا تتطلب مؤشرات أو وظائف API Windows عند الإمكان. الحل القائم TFileStream التي تقدمها skamradt تبدو جيدة بالنسبة لي.
ولكن ... يجب أن لا تقلق كثيرا ما إذا كان روتين هو 1 أو 10 خطوط للقانون، لأنك ذاهب لتغليف ذلك على أي حال في وظيفة التي تأخذ اسم ملف كمعلمة وإرجاع Int64، و وضعها في مكتبة الشخصية من التعليمات البرمجية التي يمكن إعادة استخدامها. ثم هل يمكن أن نسميها مثل ذلك:
وGetMyFileSize (Application.ExeName)؛
ويمكنك أن تجرب هذا:
if FindFirst(ExpandFileName(Application.exename), faAnyFile, SearchRec) = 0 then
MessageDlg(Format('Tamaño: <%d>',[SearchRec.Size]), mtInformation, [mbOK], 0);
FindClose(SearchRec);
و===============
نفتالي
وتيارات استخدامها بدون متغير TFileStream:
with TFilestream.create(paramstr(0), fmOpenRead or fmShareDenyNone) do
aFileSize := Size;
Free;
end;
والقبيح، نعم.
وانا افضل استخدام DSiFileSize من DSiWin32 . ويستخدم CreateFile داخليا:
function DSiFileSize(const fileName: string): int64;
var
fHandle: DWORD;
begin
fHandle := CreateFile(PChar(fileName), 0, 0, nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
if fHandle = INVALID_HANDLE_VALUE then
Result := -1
else try
Int64Rec(Result).Lo := GetFileSize(fHandle, @Int64Rec(Result).Hi);
finally CloseHandle(fHandle); end;
end; { DSiFileSize }
للأسف ليس من الممكن أن تفعل ذلك مع واحد فقط أو اثنين من الأسطر من التعليمات البرمجية دون استخدام بعض المكتبات.
الجزء السهل الحصول على التطبيق ملف exe.يمكنك العثور عليه في Application.ExeName
بشكل عام هناك عدة احتمالات لاسترجاع حجم الملف:
- فتح الملف و قراءة حجم تيار.هذا يمكن إنجازه باستخدام 'القديمة' دلفي وظائف
FileOpen
وFileSize
, أو معTFileStream
(استخدامsize
الملكية) أو مع Win32 API وظائفCreateFile
وGetFileSize
وظيفة.(منصة dependend!) تأكد من فتح الملف مع وصول للقراءة فقط. - في محض Win32 envinronment يمكنك استخدام
FindFirst
للحصول على حجم الملف.يمكنك قراءتها منTSearchRec.FindData.nFileSizeLow
.إذا كنت تريد أن تكون على استعداد ملفات أكبر من 2 غيغابايت (يجب أن يكون) عليك أن تستخدم أيضاnFileSizeHigh
جزء. - في Delphi.NET يمكنك استخدام
System.IO.FileInfo
, مثل هذا:FileInfo.Create(filename).Length
(بطانة واحدة) - في لينكس يمكنك استخدام
lstat64
وظيفة (الوحدةLibc
) و الحصول على حجم منTStatBuf64.st_size
.(اثنين-بطانة إذا كنت لا تعول متغير)
في JCL المكتبة يمكنك أن تجد العديد من الوظائف المفيدة ، بما في ذلك وظيفة بسيطة والتي ترجع حجم ملف معين اسم الملف.(ويستخدم الأسلوب الذي يناسب منصة معينة)
uses IdGlobalProtocols;
var
ExeSize: Int64;
begin
ExeSize := FileSizeByName(ParamStr(0));
// or
ExeSize := FileSizeByName(Application.ExeName);
end;
أود أن تعديل التعليمات البرمجية التي تقدمها skamradt ، لجعله سطرين من التعليمات البرمجية كما يمكنك طلب ;-)
with tFilestream.create(paramstr(0),fmOpenRead or fmShareDenyNone) do
ShowMessage(IntToStr(size));
ولكن أود أن تفضل استخدام الكود كما skamradt كتب لأنه أكثر أمانا
وأقصر ما يمكن القيام به. لاحظ أن. الحجم في بايت، وذلك لكيلوبايت، القسمة 1024.
procedure TForm1.Button1Click(Sender: TObject);
begin
with TFileStream.Create(Application.ExeName,fmShareDenyNone) do
ShowMessage(FloatToStr(Size/1024));
end;