आप सी में फ़ाइल का आकार कैसे निर्धारित करते हैं?

मैं बाइट्स में फ़ाइल के आकार को कैसे समझ सकता हूं?

#include 

unsigned int fsize(char* file){
  //what goes here?
}
0
ro fr bn

12 उत्तर

int का उपयोग न करें। आकार में 2 गीगाबाइट से अधिक फ़ाइलें इन दिनों गंदगी के रूप में आम हैं

हस्ताक्षरित int का उपयोग न करें। आकार में 4 गीगाबाइट से अधिक फ़ाइलें कुछ कम-कम-सामान्य गंदगी के समान होती हैं

आईआईआरसी मानक पुस्तकालय एक कोडित 64 बिट पूर्णांक के रूप में off_t को परिभाषित करता है, जो कि हर किसी का उपयोग करना चाहिए। हम कुछ वर्षों में 128 बिट्स को फिर से परिभाषित कर सकते हैं जब हम 16 एक्साबाइट फाइलें लटकते हैं।

If you're on windows, you should use GetFileSizeEx - it actually uses a signed 64 bit integer, so they'll start hitting problems with 8 exabyte files. Foolish Microsoft! :-)

0
जोड़ा
मैंने कंपाइलर्स का उपयोग किया है जहां off_t 32 बिट्स है। अनुमोदित, यह एम्बेडेड सिस्टम पर है जहां 4 जीबी फाइलें कम आम हैं। वैसे भी, POSIX भी भ्रम में जोड़ने के लिए off64_t और संबंधित विधियों को परिभाषित करता है।
जोड़ा लेखक Aaron Campbell, स्रोत

** ऐसा मत करें ( क्यों? ):

सी 99 मानक डॉक को उद्धृत करते हुए जो मुझे ऑनलाइन मिला: "फाइल स्थिति संकेतक को फ़ाइल के अंत में सेट करना, जैसे कि fseek (फ़ाइल, 0, SEEK_END) के साथ, बाइनरी स्ट्रीम के लिए व्यवहार को अपरिभाषित किया गया है (संभावित पीछे की ओर पात्र) या राज्य-निर्भर एन्कोडिंग वाले किसी भी स्ट्रीम के लिए जो प्रारंभिक शिफ्ट स्थिति में निश्चित रूप से समाप्त नहीं होता है। **

परिभाषा को int में बदलें ताकि त्रुटि संदेशों को प्रेषित किया जा सके, और फिर फ़ाइल आकार निर्धारित करने के लिए 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
}
0
जोड़ा
कई गैर-पॉजिक्स अनुपालन प्रणालियों पर फ़ाइल आकार प्राप्त करने का यह एकमात्र तरीका है (जैसे कि मेरा बहुत ही सरल मैबेड)
जोड़ा लेखक Earlz, स्रोत
@mezhaka: वह सीईआरटी रिपोर्ट बस गलत है। fseeko और ftello (या fseek और ftell यदि आप पूर्व के बिना अटक गए हैं और सीमाओं से खुश हैं फ़ाइल आकार जो आप काम कर सकते हैं) फ़ाइल की लंबाई निर्धारित करने का सही तरीका है। stat -based समाधान काम नहीं करते कई "फ़ाइलों" (जैसे ब्लॉक डिवाइस) पर और गैर-पॉज़िक्स-आईएसएच सिस्टम के लिए पोर्टेबल नहीं हैं।
जोड़ा लेखक R.., स्रोत

फ़ाइल के ब्योरे को पुनः प्राप्त करने के लिए आपको लाइब्रेरी फ़ंक्शन का उपयोग करने की आवश्यकता होगी। चूंकि सी पूरी तरह से मंच स्वतंत्र है, आपको हमें यह बताने की आवश्यकता होगी कि आप किस मंच/ऑपरेटिंग सिस्टम के लिए विकास कर रहे हैं!

0
जोड़ा

आप फ़ाइल खोल सकते हैं, फाइल के निचले हिस्से से 0 ऑफसेट रिश्तेदार पर जाएं

#define SEEKBOTTOM   2

fseek(handle, 0, SEEKBOTTOM)  

fseek से वापस मूल्य फ़ाइल का आकार है।

मैंने लंबे समय तक सी में कोड नहीं किया, लेकिन मुझे लगता है कि इसे काम करना चाहिए।

0
जोड़ा
आपको SEEKBOTTOM जैसे कुछ को परिभाषित नहीं करना चाहिए। # शामिल fseek (हैंडल, 0, SEEK_END);
जोड़ा लेखक sigjuice, स्रोत

मैट के समाधान को काम करना चाहिए, सिवाय इसके कि यह सी के बजाय सी ++ है, और प्रारंभिक बताना आवश्यक नहीं होना चाहिए।

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;
}

आपके लिए भी अपनी ब्रेस फिक्स्ड। ;)

अद्यतन: यह वास्तव में सबसे अच्छा समाधान नहीं है। यह विंडोज़ पर 4 जीबी फाइलों तक सीमित है और यह केवल GetFileSizeEx या stat64 जैसे प्लेटफ़ॉर्म-विशिष्ट कॉल का उपयोग करने से धीमा है।

0
जोड़ा
हाँ तुम्हें करना चाहिए। हालांकि, जब तक कि वास्तव में आकर्षक कारण नहीं है, प्लेटफ़ॉर्म-विशिष्ट नहीं लिखते हैं, हालांकि, आपको शायद खुले/तलाश-अंत/बताना/बंद पैटर्न के बजाय प्लेटफॉर्म-विशिष्ट कॉल का उपयोग करना चाहिए।
जोड़ा लेखक Derek Park, स्रोत
@ जस्टिन, आपको शायद उस मुद्दे के बारे में विशेष रूप से एक नया प्रश्न खोलना चाहिए जिसमें आप चल रहे हैं, और आप जिस मंच पर हैं, आप फाइलों तक कैसे पहुंच रहे हैं, और व्यवहार क्या है, इसके बारे में विवरण प्रदान करें।
जोड़ा लेखक Derek Park, स्रोत
मैं सहमत हूँ। कास्ट इस सवाल में मूल प्रोटोटाइप से मेल खाना था। मुझे याद नहीं है कि मैंने इसे बिना हस्ताक्षर किए int के बजाय हस्ताक्षरित लंबे समय में क्यों बदल दिया।
जोड़ा लेखक Derek Park, स्रोत
देर से उत्तर के बारे में खेद है, लेकिन मुझे यहां एक बड़ी समस्या है। यह प्रतिबंधित फ़ाइलों तक पहुंचने पर ऐप को लटकने का कारण बनता है (जैसे पासवर्ड संरक्षित या सिस्टम फाइलें)। क्या आवश्यकता होने पर उपयोगकर्ता को पासवर्ड के लिए पूछने का कोई तरीका है?
जोड़ा लेखक Justin, स्रोत
सी 99 और सी 11 दोनों ftell() से long int लौटाते हैं। (हस्ताक्षरित लंबा) कास्टिंग उस सीमा को बेहतर नहीं करता है जैसा कि पहले से ही फ़ंक्शन द्वारा सीमित है। ftell() त्रुटि पर वापसी -1 और जो कलाकार के साथ obfuscated हो जाता है। सुझाव fsize() उसी प्रकार को ftell() के रूप में वापस करें।
जोड़ा लेखक chux, स्रोत

यदि आप std c लाइब्रेरी का उपयोग करने के साथ ठीक हैं:

#include 
off_t fsize(char *file) {
    struct stat filestat;
    if (stat(file, &filestat) == 0) {
        return filestat.st_size;
    }
    return 0;
}
0
जोड़ा
यह मानक सी नहीं है। यह पीओएसईक्स मानक का हिस्सा है, लेकिन सी मानक नहीं है।
जोड़ा लेखक Derek Park, स्रोत

इसे इस्तेमाल करे --

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

यह पहले क्या करता है, फ़ाइल के अंत की तलाश में; फिर, रिपोर्ट करें कि फ़ाइल सूचक कहाँ है। अंत में (यह वैकल्पिक है) यह फ़ाइल की शुरुआत में वापस आता है। ध्यान दें कि fp एक बाइनरी स्ट्रीम होना चाहिए।

file_size में फ़ाइल में बाइट्स की संख्या शामिल है। ध्यान दें कि चूंकि (climits.h के अनुसार) हस्ताक्षरित लंबे प्रकार तक 42 9 4 9 672 9 5 बाइट्स (4 गीगाबाइट्स) तक सीमित है, यदि आपको उससे बड़ी फ़ाइलों से निपटने की संभावना है तो आपको एक अलग चर प्रकार ढूंढना होगा।

0
जोड़ा
यह बाइनरी स्ट्रीम के लिए अपरिभाषित व्यवहार है, और एक टेक्स्ट स्ट्रीम ftell के लिए बाइट्स की संख्या का मान प्रतिनिधि नहीं लौटाता है जिसे फ़ाइल से पढ़ा जा सकता है।
जोड़ा लेखक Andrew Henle, स्रोत
यह 8 साल पहले डेरेक का उत्तर से अलग कैसे है?
जोड़ा लेखक P.P., स्रोत

Google में एक त्वरित खोज ने fseek और ftell का उपयोग करने वाली विधि और इस प्रश्न के साथ एक थ्रेड पाया जवाब के साथ कि यह सिर्फ सी में किसी अन्य तरीके से नहीं किया जा सकता है।

You could use a portability library like NSPR (the library that powers Firefox) or check its implementation (rather hairy).

0
जोड़ा

NilObject के कोड के आधार पर:

#include 

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

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

    return -1; 
}

परिवर्तन:

  • फ़ाइल नाम तर्क को const char बनाया।
  • struct stat परिभाषा को ठीक किया गया, जो परिवर्तनीय नाम गुम था।
  • 0 की बजाय त्रुटि पर -1 लौटाता है, जो एक खाली फ़ाइल के लिए संदिग्ध होगा। off_t एक हस्ताक्षरित प्रकार है इसलिए यह संभव है।

यदि आप त्रुटि पर संदेश मुद्रित करने के लिए fsize() चाहते हैं, तो आप इसका उपयोग कर सकते हैं:

#include 
#include 
#include 
#include 

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 जीबी तक मान रखेगा। विवरण के लिए लिनक्स में बड़े फ़ाइल समर्थन के "LFS का उपयोग करना" अनुभाग देखें।

0
जोड़ा
अधिक पोर्टेबल कोड के लिए, डेरेक द्वारा प्रस्तावित fseek + ftell का उपयोग करें। नहीं। सी मानक विशेष रूप से बताता है कि fseek() से SEEK_END एक बाइनरी फ़ाइल पर अपरिभाषित व्यवहार है। 7.19.9.2 fseek function ... एक बाइनरी स्ट्रीम को fseek कॉल का अर्थ है SEEK_END , और जैसा कि नीचे बताया गया है, जो पी पर फुटनोट 234 से है। लिंक किए गए सी मानक के 267, और जो विशेष रूप स
जोड़ा लेखक Andrew Henle, स्रोत
यह लिनक्स/यूनिक्स विशिष्ट है - शायद यह इंगित करने लायक है कि प्रश्न के बाद से ओएस निर्दिष्ट नहीं किया गया था।
जोड़ा लेखक Drew Hall, स्रोत
अधिक पोर्टेबल कोड के लिए, डेरेक द्वारा प्रस्तावित fseek + ftell का उपयोग करें।
जोड़ा लेखक Ciro Santilli 包子露宪 六四事件 法轮功, स्रोत
आप शायद रिटर्न प्रकार को ssize_t में बदल सकते हैं और किसी भी परेशानी के बिना ऑफ_टी से आकार कास्ट कर सकते हैं। ऐसा लगता है कि ssize_t :-) का उपयोग करने के लिए और अधिक समझदारी होगी (आकार_टी के साथ भ्रमित नहीं होना चाहिए जो हस्ताक्षरित है और त्रुटि को इंगित करने के लिए उपयोग नहीं किया जा सकता है।)
जोड़ा लेखक Ted Percival, स्रोत

मैंने फाइल की लंबाई खोजने के लिए कोड के इस सेट का इस्तेमाल किया।

//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);
0
जोड़ा

प्रश्न को देखते हुए, ftell आसानी से बाइट्स की संख्या प्राप्त कर सकता है।

  long size ;
  size = ftell(FILENAME);
  printf("total size is %ld bytes",size);
0
जोड़ा
ftell एक फ़ाइल डिस्क्रिप्टर की अपेक्षा करता है, फ़ाइल नाम नहीं, तर्क के रूप में।
जोड़ा लेखक Barmar, स्रोत

यहां एक सरल और साफ फ़ंक्शन है जो फ़ाइल आकार देता है।

long get_file_size(char *path)
{
    FILE *fp;
    /* Open file for reading */
    fp = fopen(path, "r");
    fseek(fp, 0, SEEK_END);
    return ftell(fp); 
}
0
जोड़ा
क्या आपको फ़ाइल को बंद करने की आवश्यकता नहीं है?
जोड़ा लेखक Jerry Jeremiah, स्रोत