تحديد حجم ملف أكبر من 4 جيجا بايت
سؤال
يقوم الكود حاليًا بهذا ويتعامل fgetpos مع ملفات أكبر من 4 جيجابايت ولكن البحث يُرجع خطأ، لذا فإن أي فكرة عن كيفية البحث حتى نهاية file > 4GB
?
fpos_t currentpos;
sok=fseek(fp,0,SEEK_END);
assert(sok==0,"Seek error!");
fgetpos(fp,¤tpos);
m_filesize=currentpos;
المحلول
إذا كنت تستخدم نظام التشغيل Windows، فأنت تريد ذلك GetFileSizeEx (MSDN).قيمة الإرجاع هي int 64 بت.
على لينكس ستات64 (الصفحة الرئيسية) صحيح.fstat إذا كنت تعمل مع ملف * .
نصائح أخرى
تجاهل كافة الإجابات التي يظهر فيها الرقم "64".في نظام Linux، يجب عليك إضافة -D_FILE_OFFSET_BITS=64
إلى CFLAGS الخاص بك واستخدم ملف fseeko
و ftello
الوظائف التي تأخذ/تعود off_t
القيم بدلا من long
.هذه ليست جزءًا من C ولكنها POSIX.قد تحتاج أنظمة POSIX الأخرى (غير Linux) إلى خيارات مختلفة لضمان ذلك off_t
هو 64 بت.تحقق من الوثائق الخاصة بك.
هذا الرمز يعمل لي في Linux:
int64_t bigFileSize(const char *path)
{
struct stat64 S;
if(-1 == stat64(path, &S))
{
printf("Error!\r\n");
return -1;
}
return S.st_size;
}
(مسروقة من دليل glibc)
int fgetpos64 (FILE *stream, fpos64_t *position)
تشبه هذه الوظيفة fgetpos ولكن يتم إرجاع موضع الملف في متغير من النوع fpos64_t
إلى أي موقف يشير.
إذا تم تجميع المصادر مع _FILE_OFFSET_BITS == 64
تتوفر هذه الوظيفة على جهاز 32 بت تحت الاسم fgetpos
ويستبدل الواجهة القديمة بشفافية.
يعد Stat دائمًا أفضل من fseek لتحديد حجم الملف، وسيفشل بأمان في الأشياء التي ليست ملفًا.تعد ملفات 64 بت أمرًا محددًا للتشغيل، ففي دول مجلس التعاون الخليجي يمكنك وضع "64" في نهاية الأوامر، أو يمكنك إجبارها على إجراء جميع الاستدعاءات القياسية 64 بشكل افتراضي.راجع دليل المترجم الخاص بك للحصول على التفاصيل.
على نظام Linux، على الأقل، يمكنك استخدام lseek64 بدلاً من fseek.