C의 파일 크기는 어떻게 결정합니까?
파일 크기(바이트)를 확인하려면 어떻게 해야 합니까?
#include <stdio.h>
unsigned int fsize(char* file){
//what goes here?
}
Unix와 같은 시스템에서는 POSIX 시스템콜을 사용할 수 있습니다.패스 또는fstat
이미 열려 있는 파일 기술자(POSIX man 페이지, Linux man 페이지)에 있습니다.
를 (에서 가져옵니다).open(2)
, 「」fileno(FILE*)
(일본어판)
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;
}
변경 사항:
- 를 filename a filename으로 .
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
최대 2GB의 값만 저장할 수 있습니다.자세한 내용은 Linux 대용량 파일 지원의 "LFS 사용" 섹션을 참조하십시오.
마세요int
가 넘는 . 요즘 2기가바이트가 넘는 파일들은 쓰레기처럼 흔하다.
마세요unsigned int
이지 않은 먼지로 4기가바이트 이상의 파일은 흔하지 않은 먼지로 일반적입니다.
는 IIRC를 정의합니다.off_t
64세16엑사바이트 파일이 저장되기 시작하면 몇 년 안에 128비트로 다시 정의할 수 있습니다.
Windows 를 사용하고 있는 경우는, Get File Size Ex 를 사용하는 것이 좋습니다.Get File Size Ex 는 실제로는 부호 있는 64비트 정수를 사용하기 때문에, 8 엑사바이트의 파일에 문제가 생기기 시작합니다.어리석은 Microsoft! :-)
POSIX
POSIX 표준에는 파일 크기를 가져오는 고유한 방법이 있습니다.
를함 include include include sys/stat.h
헤더
개요
- 를 사용하여 파일 통계 정보를 가져옵니다.
- ★★★★★★★★★★★★★★★★★를 손에 넣다
st_size
★★★★★★★★★★★★★★★★★★.
예
주의: 사이즈는 다음과 같습니다.4GB
않은 경우아니라면Fat32
버전을 합니다.
#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는 파일 길이를 직접 결정하는 방법을 제공하지 않습니다.
머리를 써야 할 것 같아요.!!은!!!!!!!!
개요
- 를 사용하여 파일을 끝까지 검색합니다.
- 를 사용하여 현재 위치를 가져옵니다.
예
#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비트 지원이 있기 때문입니다.
Matt의 솔루션은 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;
}
버팀대도 고쳐놨어;)
업데이트: 이 솔루션은 그다지 좋은 솔루션이 아닙니다.Windows 상의 파일은 4GB로 제한되어 있으며 플랫폼 고유의 호출을 사용하는 것보다 속도가 느릴 수 있습니다.GetFileSizeEx
또는stat64
.
윈도 파일 상세에서 추출된 C++ MFC. 이것이 검색보다 성능이 좋은지는 모르겠지만 메타데이터에서 추출된 경우에는 파일 전체를 읽을 필요가 없기 때문에 더 빠릅니다.
ULONGLONG GetFileSizeAtt(const wchar_t *wFile)
{
WIN32_FILE_ATTRIBUTE_DATA fileInfo;
ULONGLONG FileSize = 0ULL;
//https://docs.microsoft.com/nl-nl/windows/win32/api/fileapi/nf-fileapi-getfileattributesexa?redirectedfrom=MSDN
//https://docs.microsoft.com/nl-nl/windows/win32/api/fileapi/ns-fileapi-win32_file_attribute_data?redirectedfrom=MSDN
if (GetFileAttributesEx(wFile, GetFileExInfoStandard, &fileInfo))
{
ULARGE_INTEGER ul;
ul.HighPart = fileInfo.nFileSizeHigh;
ul.LowPart = fileInfo.nFileSizeLow;
FileSize = ul.QuadPart;
}
return FileSize;
}
이 코드 세트를 사용하여 파일 길이를 구했습니다.
//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 오프셋으로 이동할 수 있습니다.
#define SEEKBOTTOM 2
fseek(handle, 0, SEEKBOTTOM)
fseek에서 반환되는 값은 파일 크기입니다.
오랫동안 C로 코드를 입력하지 않았지만, 작동해야 할 것 같습니다.
**이러지 마세요(왜?):
온라인에서 찾은 C99 표준 문서를 인용: "파일 위치 표시기를 파일 끝 표시기로 설정(예:
fseek(file, 0, SEEK_END)
는 바이너리 스트림의 동작을 정의하지 않았습니다(Null 문자의 후행 가능성이 있기 때문에).또는 초기 시프트 스테이트로 확실히 종료되지 않는 스테이트 의존 부호화를 가지는 스트림에 대해서 정의되어 있지 않습니다.**
에러 메시지를 송신할 수 있도록 정의를 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
}
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;
}
이것을 시험해 보세요--
fseek(fp, 0, SEEK_END);
unsigned long int file_size = ftell(fp);
rewind(fp);
이 작업은 먼저 파일 끝까지 탐색한 다음 파일 포인터의 위치를 보고합니다.마지막으로(선택사항) 파일의 선두로 되돌아갑니다.주의:fp
는 바이너리 스트림이어야 합니다.
file_size에는 파일에 포함된 바이트 수가 포함됩니다.(clim.h에 따르면) 부호 없는 롱타입은 4294967295바이트(4GB)로 제한되어 있기 때문에 그보다 큰 파일을 처리할 가능성이 높은 경우에는 다른 변수 타입을 찾아야 합니다.
여기 파일 크기를 반환하는 단순하고 깨끗한 함수가 있습니다.
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);
fclose(fp);
return
}
이 기능에는, 이 기능뿐입니다.stdio.h
매우 마음에 들고, 동작도 좋고, 매우 간결합니다.
size_t fsize(FILE *File) {
size_t FSZ;
fseek(File, 0, 2);
FSZ = ftell(File);
rewind(File);
return FSZ;
}
Windows 앱을 빌드하고 있는 경우는, GetFileSizeEx API 를 사용해 주세요.CRT 파일 I/O는 특히 파일 길이를 결정하는 데 복잡하기 때문입니다.시스템마다 파일 표시의 특성이 다르기 때문입니다.
나는 fseek와 ftell을 사용하는 방법과 이 질문의 스레드를 사용하여 C만으로는 할 수 없다는 답을 찾았습니다.
NSPR(Firefox에 전원을 공급하는 라이브러리)과 같은 이식성 라이브러리를 사용할 수 있습니다.
언급URL : https://stackoverflow.com/questions/8236/how-do-you-determine-the-size-of-a-file-in-c
'programing' 카테고리의 다른 글
Vue.js - vue-axios 응답 데이터를 저장 및 표시하려고 할 때 공리가 정의되지 않음 (0) | 2022.06.12 |
---|---|
변수 개수의 인수를 받아들이는 함수에 전달된 인수 수를 계산하는 방법은 무엇입니까? (0) | 2022.06.12 |
NuxtJs 스토어에서 localStorage에 액세스하려면 어떻게 해야 합니까? (0) | 2022.06.12 |
C11에서의 _Generic 구문 및 사용 예 (0) | 2022.06.12 |
Vue 라우터 링크에서 밑줄을 제거할 수 없음 (0) | 2022.06.12 |