EasyDelphi Q&A

.تم الانتقال للموقع الجديد . وسيبقى الموقع القديم هذا متاح للقراءة فقط حتى الانتهاء من نقل كل الاسئلة إلى الموقع الجديد

يمكنك طرح الاسئلة والنقاشات في الموقع الجديد. الذهاب للموقع الجديد


+1 تصويت
281 مشاهدات

هل يوجد تابع جاهز في مكتبة الدلفي يعيد حجم الملف عن طريق اسم  FileSize
بدون الحاجة لكتابة تابع خاص؟

سُئل في تصنيف Delphi بواسطة (16,020 نقاط) | 281 مشاهدات

3 إجابة

–1 تصويت
أفضل إجابة

التابع الجاهز هو التابع المتوفر بمكتبة اللغة، مثلا MidStr هو تابع جاهز، ال Sin هو تابع جاهز، و عادة ما نسأل عن توفره في المكتبة الاساسية، حتى يتم التخلص من الموجود في مكتباتنا من مبدأ التوفير، او من خلال متابعة بعض المبتدئين، يجب توفير مثل هذه التوابع لهم، حتى لا تضيع جهودهم فيها.

الحلول التي لدي في مكتبتي القديمة من 20 سنة

function GetFileSize(const aFilename: String): Int64;
var
  info: TWin32FileAttributeData;
begin
  if GetFileAttributesEx(PWideChar(aFileName), GetFileExInfoStandard, @info) then
    Result := Int64(info.nFileSizeLow) or Int64(info.nFileSizeHigh shl 32)
  else
    Result := 0;
end;

function GetFileSize(const aFilename: String): Int64;
var
   sr : TSearchRec;
begin
  if FindFirst(vName, faAnyFile, sr ) = 0 then
    Result := sr.Size
  else
    Result := 0;
  FindClose(sr) ;
end;

 

تم الرد عليه بواسطة (16,020 نقاط)
مختارة بواسطة
–1 تصويت

موجود System.FileSize . وحسب ما تكون معرف الملف

 

var
myfile: file of byte;
size: longInt;
begin
  AssignFile(myfile, 'c:\myfile');
  rest(myfile); 
  try
    size := FileSize(myfile);
    showMessage(inttostr(size)); 
  finaly
    closeFile(myfile);
  end;
end;


وحسب تعريف الملف ، اذا كان of record فالنتيجة هي عدد السجلات . واذا untyped النتيجة حجم بالبايتات لكن ستكون النتيجة مقسومة على 128 . وهذا الحجم الذي سيفترضه التطبيق في حال عدم تحديد حجم السجل في Reset . وبما ان الملف untyped . فانت بحاجة لضرب النتيجة بـ 128 للحصول على حجم الملف الصحيح بالبايتات .

راجع هذا : http://docwiki.embarcadero.com/Libraries/Rio/en/System.FileSize

تم الرد عليه بواسطة (32,580 نقاط)
عُدل بواسطة
0

أنا أتحدث عن الاجراء نفسه, وأعرف أنه في System unit, ومتأكد مما قلت, والدليل الصور والنتيجة, التابع يعطي ناتج integer 32bit. و32bit حدها الأقصى 2GB بما أنه signed, أو 4GB إذا كان unsigned

Cardinal(size)

هنا مذكور مشكل التابع مع الملفات الكبيرة: https://stackoverflow.com/questions/1642220/getting-size-of-a-file-in-delphi-2010-or-later/17723115#comment72568299_17723115

وهنا: https://stackoverflow.com/a/13171856/10946280

وفي الكتاب Delphi In A Nustshell الصفحة 209, لمن ليس لديه الكتاب يمكنه إلقاء نظرة هنا:

FileSize does not support files larger than 2 GB. See the FileSeek func-

tion in the SysUtils unit, or call the Windows API for large files.

يمكنك أن تستخلص النتيجة بدون هذه المصادر: التابع يرجع فيمة 32bit Integer, والتي لا تتعدى 2GB. 

0
أخي . اذا كنت متاكد من الموضوع . اكتب هذا الكلام في الاجابات

شيء اخر ضروري . هو اختيارك للمراجع :
١ ـ يجب الاخذ بعين الاعتبار أن ستاك اوفرفلو مثله مثل هذا الموقع . يحتوي على الكثير من الاجابات وليس كلها صحيحة .  لا اقول انه لا يفيد ولا يمكن الرجوع له . ما اقصده انه يجب التاكد من الاجابات اولا .
٢ ـ المراجع التي اشرت إليها . قديمة جدا . وهذا ايضا يجب الانتباه له . الكثير من الامور تغير وتتغير . الاجابات القديمة بحاجة لتدقيق .
الكتاب Delphi in a nustshell مضى عليه تسع سنوات . والسؤالين في ستاك اوفرفلو ايضا مطروحة من عشر سنوات .

صراحة لم تظهر هذه المشكلة عندي لاني لم احتاجها سابقا . والموضوع لم يذكر في مستند المساعدة . لاحظ اني لم انفيه ولم انكره . انا فقط شككت فيه.  ولم يتثنى لي الوقت الكافي للبحث عن تعديلات جديد . وبما انك جربته ومتاكد . فيرجى كتابة ملخص بسيط كإجابة تستخدم فيها FileSize مع ذكر هذه الملاحظات والتنويهات .

فقط اكتب هذه المعلومات ضمن الاجابات . اما اجابة جديدة أو عدل اجابتك السابقة . ليستفيد الجميع . فليس كل الناس تتابع التعليقات . والغاية من الموقع هو ايصال اكبر قدر من المعلومات للاعضاء.

ولك جزيل الشكر لمشاركتك . :)
0
يرجى التاكد من الصور التي نشرتها في التعليقات . الصور لم تظهر. حاول تحميلها في الموقع هنا .
0

إجابة لمن؟, كان هذا تعليقًا مني على التابع الذي وضعته لا حاجة لكتابتها كجواب, أيضًا تعمدت وضع رابط Stackoverflow, لأنه مكتوب في السؤال
كيفية ايجاد حجم الملف في delphi 2010 وما بعده, وفي التعليقات تبين أن التابع الذي وضعتَه System.FileSize هو تابع قديم ويرجى تركه في الاصدارات الحديثة.

التجربة أفضل دليل, فقد بينت في الصور نتيجة التابع, سأحاول رفعهم على موقع آخر.

والموضوع لم يذكر في مستند المساعدة

لا حاجة لذكر ملف المساعدة لذلك, فنتيجة التابع Integer تبين لك الحد الأقصى, أيضًا عدم ذكره لا يعني عدم حدوثه, ملفات المساعدة ليست شاملة.

 

0
اجابة على هذا السؤال . اعرف انك كتبت تعليق. وانا طلبت منك اضافة اجابة جديدة فيها الـ FileSize . مع الملاحظات التي ذكرتها انت . حتى يتمكن الناس من اخذ معلومة جديدة ومفيدة.. لان الناس لن تقرأ كل التعليقات . اين المشكلة في هذا ؟ ان كنت لا تريد فلا بأس .

عبارة ( 2010 وما بعدها ) غير مقبولة بشكلها العام . فلا كاتب السؤال ولا المجيب يعرف ماذا سيحدث في المستقبل .  وانا لم اطلب غير اخذ ملاحظة انه يجب البحث عن احدث الاجابات وعدم الاكتفاء بالقديمة ولا اعتبارها اجابات قاطعة . فقط

( التابع هو تابع قديم ويرجى تركه في الاصدارات الحديثة ) ما دام موجود في الاصدار الاخير فلا مانع من استخدامه . وكيفي الانتباه للملاحظات عليه . اما يجب تركه . فهذا يعبر مبالغة في الامر. ولا اعتقد ان النصيحة يجب ان تكون بهذا الشكل . الافضل ان تكون النصيحة هي الانتباه للحالات استخدام الاجراء .

( التجربة افضل دليل ) بشكل عام التجربة لا تكفي. لكن اتفق معك على انها مهمة . بالنسبة للصورة فهي لم تظهر سابقا . والان موجودة.

( لا حاجة لذكر ملف المساعدة ) . ملفات المساعدة المرفقة مع الدلفي هي اول شيء يجب البدء منه لاخذ المعلومات . وطبعا هي ليست شاملة . واكرر اني لم انفي بل شككت والسبب عدم ذكره .
–1 تصويت

يمكنك استخدام TFileStream:

var
  fileSize: Int64;
  fileStream: TFileStream;
begin
  fileStream := TFileStream.Create('PathToFile', fmOpenRead);
  fileSize := fileStream.size;
  ShowMessage('File size in bytes: '+fileSize.ToString);
  fileStream.Free;
end;

 

تم الرد عليه بواسطة (1,330 نقاط)
–1
اريد تابع جاهز ليس ان اكتب تابع
0
هذا التابع غير جيد، لانه يقوم بفتح الملف، و عمل seek لآخر الملف لمعرفة الحجم، بينما يمكن معرفة حجم الملف من النظام نفسه بدون فتح الملف.

اسئلة متعلقة

+2 تصويتات
1 إجابة
سُئل سبتمبر 16، 2018 في تصنيف Delphi بواسطة alhmam (800 نقاط) | 108 مشاهدات
+1 تصويت
2 إجابة
سُئل نوفمبر 20، 2019 في تصنيف fmx بواسطة xorpas (1,360 نقاط) | 119 مشاهدات
+3 تصويتات
2 إجابة
سُئل يوليو 19، 2018 في تصنيف Delphi بواسطة Amar Gozim (11,220 نقاط) | 153 مشاهدات
0 تصويتات
1 إجابة
سُئل مايو 23، 2019 في تصنيف vcl بواسطة KHALED (7,900 نقاط) | 50 مشاهدات
+4 تصويتات
4 إجابة
سُئل يوليو 5، 2018 بواسطة مجهول | 474 مشاهدات
ادعُ اصدقائك في الفايسبوك لمشاركتك
Comodo SSL

مرحبًا بك إلى EasyDelphi Q&A، حيث يمكنك طرح الأسئلة والحصول على الإجابة عليها من المستخدمين الآخرين.

لا يسمح بطلب او السؤال عن كراك او تفعيل او كسر او فك او اي شيء يخالف اتفاقيات الترخيص  مهما كان السبب ومهما كان البرنامج ونوعه. ولا حتى نشر روابط تحتوي على مثل هذه الاشياء لا في الاسئلة ولا في الاجابات ولا التعليقات . نهائيا

497 سؤال
752 إجابة
1,417 تعليق
273 مستخدم