سؤال

كيف يمكنني معرفة حجم الملف بالبايت?

#include <stdio.h>

unsigned int fsize(char* file){
  //what goes here?
}
هل كانت مفيدة؟

المحلول

على أساس NilObject كود:

#include <sys/stat.h>
#include <sys/types.h>

off_t fsize(const char *filename) {
    struct stat st; 

    if (stat(filename, &st) == 0)
        return st.st_size;

    return -1; 
}

التغييرات:

  • جعلت اسم الملف الحجة const char.
  • تصحيح struct stat التعريف الذي كان في عداد المفقودين اسم المتغير.
  • يعود -1 على خطأ بدلا من 0, التي قد تكون غامضة على ملف فارغ. off_t هو توقيع من النوع هذا ممكن.

إذا كنت تريد fsize() لطباعة رسالة على خطأ, يمكنك استخدام هذا:

#include <sys/stat.h>
#include <sys/types.h>
#include <string.h>
#include <stdio.h>
#include <errno.h>

off_t fsize(const char *filename) {
    struct stat st;

    if (stat(filename, &st) == 0)
        return st.st_size;

    fprintf(stderr, "Cannot determine size of %s: %s\n",
            filename, strerror(errno));

    return -1;
}

على أنظمة 32 بت يجب تجميع هذا مع خيار -D_FILE_OFFSET_BITS=64, وإلا off_t فقط اضغط قيم تصل إلى 2 GB.راجع "استخدام LFS" قسم من ملف كبير في دعم لينكس للحصول على التفاصيل.

نصائح أخرى

لا تستخدم int.ملفات أكثر من 2 غيغابايت في الحجم هي شائعة مثل التراب في هذه الأيام

لا تستخدم unsigned int.ملفات أكثر من 4 غيغا بايت في الحجم هي شائعة مثل بعض قليلا أقل شيوعا التراب

IIRC المكتبة القياسية يعرف off_t كما غير موقعة 64 بت عدد صحيح ، وهو ما يجب على الجميع أن تستخدم.يمكننا تعريف أن يكون 128 بت في بضع سنوات عندما نبدأ وجود 16 إكسابايت الملفات التسكع.

إذا كنت على ويندوز, يجب عليك استخدام GetFileSizeEx - في الحقيقة يستخدم وقعت 64 بت عدد صحيح ، ولذلك سوف تبدأ ضرب مشاكل مع 8 إكسابايت الملفات.من الغباء مايكروسوفت!:-)

مات الحل يجب أن تعمل ، إلا أنه من C++ بدلا من C و الأولية أقول يجب أن لا يكون ضروريا.

unsigned long fsize(char* file)
{
    FILE * f = fopen(file, "r");
    fseek(f, 0, SEEK_END);
    unsigned long len = (unsigned long)ftell(f);
    fclose(f);
    return len;
}

الثابت الخاص بك هدفين بالنسبة لك أيضا.;)

تحديث:هذا ليس حقا أفضل حل.انها تقتصر على 4GB الملفات على ويندوز وأنه من المرجح أبطأ من مجرد استخدام منصة-دعوة محددة مثل GetFileSizeEx أو stat64.

**لا تفعل هذا (لماذا ؟ ):

نقلا عن C99 القياسية doc التي وجدت على الانترنت:"إعداد الملف وضع المؤشر إلى نهاية الملف ، مع fseek(ملف, 0, SEEK_END) ، غير معرف سلوك تيار الثنائية (لأنه من الممكن زائدة أحرف فارغة) أو أي تيار مع الدولة التي تعتمد على الترميز الذي لا بالتأكيد في نهاية الأولي تحول الدولة.**

تغيير تعريف الباحث بحيث رسائل الخطأ يمكن أن تنتقل ، ومن ثم استخدام fseek() و ftell() لتحديد حجم الملف.

int fsize(char* file) {
  int size;
  FILE* fh;

  fh = fopen(file, "rb"); //binary mode
  if(fh != NULL){
    if( fseek(fh, 0, SEEK_END) ){
      fclose(fh);
      return -1;
    }

    size = ftell(fh);
    fclose(fh);
    return size;
  }

  return -1; //error
}

إذا كنت بخير مع استخدام std ج المكتبة:

#include <sys/stat.h>
off_t fsize(char *file) {
    struct stat filestat;
    if (stat(file, &filestat) == 0) {
        return filestat.st_size;
    }
    return 0;
}

POSIX

على POSIX القياسية الخاصة بها طريقة للحصول على حجم الملف.
وتشمل sys/stat.h رأس لاستخدام وظيفة.

ملخص

  • الحصول على ملف الإحصاءات باستخدام stat(3).
  • الحصول على st_size مكان الإقامة.

أمثلة

ملاحظة:أنه يحد من حجم 4GB.إذا لم Fat32 الملفات ثم استخدم 64 بت!

#include <stdio.h>
#include <sys/stat.h>

int main(int argc, char** argv)
{
    struct stat info;
    stat(argv[1], &info);

    // 'st' is an acronym of 'stat'
    printf("%s: size=%ld\n", argv[1], info.st_size);
}
#include <stdio.h>
#include <sys/stat.h>

int main(int argc, char** argv)
{
    struct stat64 info;
    stat64(argv[1], &info);

    // 'st' is an acronym of 'stat'
    printf("%s: size=%ld\n", argv[1], info.st_size);
}

ANSI C (قياسي)

على ANSI C لا مباشرة يوفر طريقة لتحديد طول الملف.
علينا أن نستخدم عقولنا.الآن سوف نستخدم تسعى النهج!

ملخص

  • تسعى الملف إلى النهاية باستخدام fseek(3).
  • على الوضع الحالي باستخدام ftell(3).

على سبيل المثال

#include <stdio.h>

int main(int argc, char** argv)
{
    FILE* fp = fopen(argv[1]);
    int f_size;

    fseek(fp, 0, SEEK_END);
    f_size = ftell(fp);
    rewind(fp); // to back to start again

    printf("%s: size=%ld", (unsigned long)f_size);
}

إذا كان الملف هو stdin أو الأنابيب. POSIX ، ANSI C لن تعمل.
وسوف الذهاب والعودة 0 إذا كان الملف هو أنبوب أو stdin.

الرأي:يجب عليك استخدام POSIX القياسية بدلا من ذلك.لأنه قد 64bit الدعم.

و إذا كنت بناء التطبيق ويندوز, استخدام GetFileSizeEx API كما CRT ملف I/O هو فوضوي ، خاصة لتحديد الملف طول بسبب خصوصيات في ملف التمثيل على أنظمة مختلفة ;)

بحث سريع في جوجل وجدت طريقة استخدام fseek و ftell و موضوع هذا سؤال مع الإجابات التي لا يمكن أن تتم فقط في C في طريقة أخرى.

هل يمكن استخدام قابلية المكتبة مثل NSPR (المكتبة أن القوى فايرفوكس) أو التحقق من تنفيذها (لا شعر).

لقد استخدمت هذه المجموعة من التعليمات البرمجية إلى العثور على الملف طول.

//opens a file with a file descriptor
FILE * i_file;
i_file = fopen(source, "r");

//gets a long from the file descriptor for fstat
long f_d = fileno(i_file);
struct stat buffer;
fstat(f_d, &buffer);

//stores file size
long file_length = buffer.st_size;
fclose(i_file);

جرب هذا

fseek(fp, 0, SEEK_END);
unsigned long int file_size = ftell(fp);
rewind(fp);

هذا ما يفعله هو الأولى ، تسعى إلى نهاية الملف.ثم التقرير حيث مؤشر الملف هو.وأخيرا (وهذا اختياري) أنه يلف تعود إلى بداية الملف.علما بأن fp يجب أن يكون تيار ثنائي.

file_size يحتوي على عدد وحدات البايت يحتوي على الملف.علما أنه منذ (وفقا climits.ح) غير موقعة نوع طويل محدودة إلى 4294967295 بايت (4 جيجا بايت) سوف تحتاج إلى العثور على مختلف متغير نوع إذا كنت من المرجح أن التعامل مع ملفات أكبر من ذلك.

هنا هو بسيط ونظيفة الدالة بإرجاع حجم الملف.

long get_file_size(char *path)
{
    FILE *fp;
    long size = -1;
    /* Open file for reading */
    fp = fopen(path, "r");
    fseek(fp, 0, SEEK_END);
    size = ftell(fp); 
    fp.close();
    return 
}

كنت بحاجة إلى استخدام وظيفة المكتبة لاسترداد تفاصيل الملف.كما ج تماما منصة مستقلة, وأنت تسير في حاجة إلى أن اسمحوا لنا أن نعرف ما هو منصة / نظام التشغيل كنت النامية!

النظر في السؤال ، ftell يمكن بسهولة الحصول على عدد من وحدات البايت.

  long size ;
  size = ftell(FILENAME);
  printf("total size is %ld bytes",size);

يمكنك فتح ملف ، انتقل إلى 0 تعويض نسبة من الجزء السفلي من الملف مع

#define SEEKBOTTOM   2

fseek(handle, 0, SEEKBOTTOM)  

القيمة التي تم إرجاعها من fseek هو حجم الملف.

لم التعليمات البرمجية في C لفترة طويلة ، ولكن أعتقد أنه يجب أن تعمل.

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