سؤال

يقوم الكود حاليًا بهذا ويتعامل fgetpos مع ملفات أكبر من 4 جيجابايت ولكن البحث يُرجع خطأ، لذا فإن أي فكرة عن كيفية البحث حتى نهاية file > 4GB?

fpos_t currentpos;

sok=fseek(fp,0,SEEK_END);
assert(sok==0,"Seek error!");

fgetpos(fp,&currentpos);
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.

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