मैं बाइट्स में फ़ाइल के आकार का पता कैसे लगा सकता हूं?
#include <stdio.h>
unsigned int fsize(char* file){
//what goes here?
}
char* file
, क्यों नहीं FILE* file
? -1
मैं बाइट्स में फ़ाइल के आकार का पता कैसे लगा सकता हूं?
#include <stdio.h>
unsigned int fsize(char* file){
//what goes here?
}
char* file
, क्यों नहीं FILE* file
? -1
जवाबों:
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 जीबी तक के मूल्य होंगे। विवरण के लिए लिनक्स में बड़े फ़ाइल समर्थन के "एलएफएस का उपयोग करना" अनुभाग देखें।
fseek
+ के ftell
रूप में उपयोग करें ।
fseek
+ के ftell
रूप में उपयोग करें । सं सी स्टैंडर्ड विशेष रूप से कहा गया है कि fseek()
करने के लिए SEEK_END
पर एक बाइनरी फ़ाइल अपरिभाषित व्यवहार है। 7.19.9.2 fseek
फ़ंक्शन ... बाइनरी स्ट्रीम को सार्थक रूप से fseek
कॉल का समर्थन करने की आवश्यकता नहीं हैSEEK_END
, और जैसा कि नीचे उल्लेख किया गया है, जो पी पर फुटनोट 234 से है। लिंक किए गए सी स्टैंडर्ड, और जो विशेष रूप से लेबल की 267 fseek
को SEEK_END
अपरिभाषित व्यवहार के रूप में एक बाइनरी धारा में। ।
उपयोग न करें int
। 2 गीगाबाइट से अधिक आकार की फाइलें इन दिनों गंदगी के रूप में आम हैं
उपयोग न करें unsigned int
। आकार में 4 गीगाबाइट से अधिक की फाइलें कुछ कम-सामान्य गंदगी के रूप में आम हैं
IIRC मानक पुस्तकालय off_t
एक अहस्ताक्षरित 64 बिट पूर्णांक के रूप में परिभाषित करता है , जो कि सभी को उपयोग करना चाहिए। जब हम 16 एक्सबायटे फाइलें चारों ओर लटकाना शुरू करते हैं, तो हम कुछ वर्षों में 128 बिट्स को फिर से परिभाषित कर सकते हैं।
यदि आप खिड़कियों पर हैं, तो आपको GetFileSizeEx का उपयोग करना चाहिए - यह वास्तव में एक हस्ताक्षरित 64 बिट पूर्णांक का उपयोग करता है, इसलिए वे 8 एक्साबाइट फ़ाइलों के साथ समस्याओं को मारना शुरू कर देंगे। मूर्ख Microsoft! :-)
मैट के समाधान को काम करना चाहिए, सिवाय इसके कि यह 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
।
long int
से लौटते हैं ftell()
। (unsigned long)
कास्टिंग पहले से सीमित फ़ंक्शन के अनुसार सीमा में सुधार नहीं करता है। ftell()
त्रुटि पर वापसी -1 और कि कलाकारों के साथ obfuscated मिलता है। सुझाव के fsize()
रूप में उसी प्रकार लौटें ftell()
।
** ऐसा मत करो ( क्यों? ):
C99 मानक डॉक का उद्धरण, जो मुझे ऑनलाइन मिला था: "फ़ाइल स्थिति सूचक को एंड-टू-फ़ाइल के रूप में सेट करना, जैसे
fseek(file, 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
}
fseeko
और ftello
(या fseek
और ftell
आप पूर्व और फ़ाइल आप के साथ काम कर सकते हैं आकार पर सीमा के साथ खुश बिना अटक कर रहे हैं) एक फ़ाइल की लंबाई निर्धारित करने के लिए सही तरीका है। stat
-बेड समाधान कई "फाइलों" (जैसे ब्लॉक डिवाइसेस) पर काम नहीं करते हैं और गैर-पॉसिक्स-ईश सिस्टम के लिए पोर्टेबल नहीं हैं।
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);
}
एएनएसआई सी सीधे रास्ते फ़ाइल की लंबाई निर्धारित करने के लिए प्रदान करता है नहीं करता है।
हमें अपने दिमाग का इस्तेमाल करना होगा। अभी के लिए, हम दृष्टिकोण का उपयोग करेंगे!
#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 मानक का उपयोग करना चाहिए । क्योंकि, इसमें 64 बिट सपोर्ट है।
struct _stat64
और __stat64()
_Windows के लिए।
और यदि आप एक Windows ऐप बना रहे हैं, तो GetFileSizeEx API का उपयोग CRT फ़ाइल I / O के रूप में गन्दा करें, विशेष रूप से फ़ाइल की लंबाई निर्धारित करने के लिए, विभिन्न प्रणालियों पर फ़ाइल अभ्यावेदन में विशिष्टताओं के कारण;)
यदि आप std c लाइब्रेरी का उपयोग करके ठीक हैं:
#include <sys/stat.h>
off_t fsize(char *file) {
struct stat filestat;
if (stat(file, &filestat) == 0) {
return filestat.st_size;
}
return 0;
}
Google में एक त्वरित खोज में 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 में फ़ाइल में बाइट्स की संख्या समाहित है। ध्यान दें कि चूंकि (चढ़ाई के अनुसार। H) अहस्ताक्षरित लंबा प्रकार 4294967295 बाइट्स (4 गीगाबाइट्स) तक सीमित है, यदि आपको उससे भिन्न फ़ाइलों के साथ व्यवहार करने की संभावना है, तो आपको एक भिन्न चर प्रकार खोजने की आवश्यकता होगी।
ftell
लिए फ़ाइल से पढ़ी जा सकने वाली बाइट्स की संख्या का एक मान प्रतिनिधि वापस नहीं करता है।
मेरे पास एक फ़ंक्शन है जो केवल साथ काम करता है stdio.h
। मुझे यह बहुत पसंद है और यह बहुत अच्छा काम करता है और बहुत संक्षिप्त है:
size_t fsize(FILE *File) {
size_t FSZ;
fseek(File, 0, 2);
FSZ = ftell(File);
rewind(File);
return FSZ;
}
यहां एक सरल और साफ फ़ंक्शन है जो फ़ाइल का आकार लौटाता है।
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
}
आप फ़ाइल को खोल सकते हैं, फ़ाइल के नीचे से 0 ऑफसेट रिश्तेदार पर जाएं
#define SEEKBOTTOM 2
fseek(handle, 0, SEEKBOTTOM)
fseek से दिया गया मान फ़ाइल का आकार है।
मैंने लंबे समय तक सी में कोड नहीं किया, लेकिन मुझे लगता है कि इसे काम करना चाहिए।
प्रश्न को देखते हुए, ftell
आसानी से बाइट्स की संख्या प्राप्त कर सकते हैं।
long size = ftell(FILENAME);
printf("total size is %ld bytes",size);
ftell
एक फ़ाइल डिस्क्रिप्टर की अपेक्षा करता है, न कि एक फ़ाइलनाम, तर्क के रूप में।
ftell
एक फ़ाइल डिस्क्रिप्टर की अपेक्षा नहीं करता है, यह एक FILE*
बदले की अपेक्षा करता है । पहले मैन पेज देखें!
fseek()
फ़ाइल के अंत की तलाश करने के लिए सबसे पहले उपयोग करने की आवश्यकता है , और यह भी ftell()
उम्मीद है कि FILE *
, स्ट्रिंग नहीं! आप अपने जवाब को भली भाँति परोसेंगे।