سؤال

هل هناك طريقة في دلفي للحصول على 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

بشكل عام هناك عدة احتمالات لاسترجاع حجم الملف:

  1. فتح الملف و قراءة حجم تيار.هذا يمكن إنجازه باستخدام 'القديمة' دلفي وظائف FileOpen و FileSize, أو مع TFileStream (استخدام size الملكية) أو مع Win32 API وظائف CreateFile و GetFileSize وظيفة.(منصة dependend!) تأكد من فتح الملف مع وصول للقراءة فقط.
  2. في محض Win32 envinronment يمكنك استخدام FindFirst للحصول على حجم الملف.يمكنك قراءتها من TSearchRec.FindData.nFileSizeLow.إذا كنت تريد أن تكون على استعداد ملفات أكبر من 2 غيغابايت (يجب أن يكون) عليك أن تستخدم أيضا nFileSizeHigh جزء.
  3. في Delphi.NET يمكنك استخدام System.IO.FileInfo, مثل هذا: FileInfo.Create(filename).Length (بطانة واحدة)
  4. في لينكس يمكنك استخدام 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;

هذا الرابط.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top