今天在编写小程序的时候,需要获取一个未读取的文件大小,想到文件获取的几种方式,这里总结一下,以方便以后查看学习。
在win32程序中,我们可以通过C++和C中的几个常用函数就可以做到哦~
1、 _stat 结构体
该结构体为Linux系统调用函数,其他的函数还有 fstat,lstat,就不一一列举了,童鞋们可以谷歌之或者到MSDN上仔细看下。这三者均可以返回文件的属性,而_stat结构体中成员属性st_size可以得到文件大小,只要指定文件路径即可。
1 // C++获取文件大小方法一 2 struct _stat info; 3 _stat(filepath, &info); 4 int size = info.st_size; 5 cout<<size<<endl;
2、 C语言中常用filelength函数
这个函数的名字已经出卖了它,我们可以直接使用filelength来获取文件的大小,其中输入参数为文件描述符handle,我们可以通过fileno函数将指定的文件流转换成文件的文件描述符(fileno()用来取得参数stream指定的文件流所使用的文件描述符)
1 // C++获取文件大小方法二 2 FILE* file = fopen(filepath, "rb"); 3 if (file) 4 { 5 int size = filelength(fileno(file)); 6 cout<< size<< endl; 7 fclose(file); 8 }
3、使用MFC中的文件基类CFile
当然如果想在控制台程序下使用这个类,则需要添加头文件afx.h ,当然需要将工程属性中MFC的使用一项设置为“在静态库中使用 MFC”或者“在共享DLL中使用MFC”即可~
1 // C++获取文件大小方法三 2 CFile cfile; 3 if (cfile.Open(filepath, CFile::modeRead)) 4 { 5 int size = cfile.GetLength(); 6 cout<< size<< endl; 7 }
其实这里还可以使用CFileStatus变量,如下所示,在open之后可以直接得到文件的状态,当然也包括其大小。
1 CFile file; 2 CFileStatus fileStatus; 3 file.Open(wFilePath,CFile::modeRead); 4 file.GetStatus(fileStatus); //得到打开文件的属性 5 int nSizeOfFile = fileStatus.m_size;
4、直接使用windows 的API CreateFile()获得文件句柄,然后通过GetFileSize()即可~
1 // C++获取文件大小方法四 2 HANDLE handle = CreateFile(filepath, FILE_READ_EA, 3 FILE_SHARE_READ, 0, OPEN_EXISTING, 0, 0); 4 if (handle != INVALID_HANDLE_VALUE) 5 { 6 int size = GetFileSize(handle, NULL); 7 cout<<"CreateFile: " <<size<< endl; 8 CloseHandle(handle); 9 }
还有一点需要注意的地方就是,其中第三种方法只能在文件未被占用的情况之下才能够得到正确的文件大小,其他三种方法可以在文件被占用的情况下得到正确的文件大小。