C++file_size获取文件大小C++17
如何在C++17中获取文件大小
在现代编程中,处理文件操作是一个常见的任务。无论是读取配置文件还是保存日志,了解如何获取文件大小都是非常有用的技能。本文将指导你如何在C++17中使用标准库来获取文件大小。
使用 <filesystem> 头文件
C++17引入了 <filesystem> 头文件,它提供了跨平台的文件系统操作功能。要获取文件大小,你可以使用 std::filesystem::file_size 函数。
#include <iostream>
#include <filesystem>
int main() {
std::string filePath = "example.txt";
try {
std::uintmax_t fileSize = std::filesystem::file_size(filePath);
std::cout << "File size: " << fileSize << " bytes" << std::endl;
} catch (const std::filesystem::filesystem_error& e) {
std::cerr << "Error: " << e.what() << std::endl;
}
return 0;
}
解释
- 包含头文件:首先,你需要包含
<filesystem>头文件。 - 定义文件路径:指定你要检查的文件路径。
- 获取文件大小:使用
std::filesystem::file_size函数获取文件大小,并将其存储在一个std::uintmax_t类型的变量中。 - 异常处理:使用
try-catch块捕获可能的文件系统错误,例如文件不存在或权限问题。
手动实现
如果你不想使用 <filesystem> 头文件,也可以手动实现文件大小的获取。这通常需要使用操作系统特定的API。以下是一些常见操作系统的示例:
Windows
在Windows上,可以使用 GetFileSizeEx 函数。
#include <iostream>
#include <windows.h>
int main() {
std::wstring filePath = L"example.txt";
HANDLE hFile = CreateFile(filePath.c_str(), GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
if (hFile == INVALID_HANDLE_VALUE) {
std::cerr << "Error opening file" << std::endl;
return 1;
}
LARGE_INTEGER fileSize;
if (!GetFileSizeEx(hFile, &fileSize)) {
CloseHandle(hFile);
std::cerr << "Error getting file size" << std::endl;
return 1;
}
std::cout << "File size: " << fileSize.QuadPart << " bytes" << std::endl;
CloseHandle(hFile);
return 0;
}
Linux 和 macOS
在Linux和macOS上,可以使用 stat 函数。
#include <iostream>
#include <sys/stat.h>
int main() {
const char* filePath = "example.txt";
struct stat fileStat;
if (stat(filePath, &fileStat) != 0) {
perror("Error");
return 1;
}
std::cout << "File size: " << fileStat.st_size << " bytes" << std::endl;
return 0;
}
解释
-
Windows:
- 使用
CreateFile打开文件。 - 使用
GetFileSizeEx获取文件大小。 - 关闭文件句柄。
- 使用
-
Linux 和 macOS:
- 使用
stat函数获取文件状态。 - 输出文件大小。
- 使用
总结
通过上述方法,你可以在C++17中轻松地获取文件大小。使用 <filesystem> 头文件是最简单且跨平台的方法,而手动实现则提供了更多的控制和灵活性。无论哪种方式,都可以根据你的需求选择最合适的方法。希望这篇文章对你有所帮助!
文章版权声明:除非注明,否则均为Dark零点博客原创文章,转载或复制请以超链接形式并注明出处。


还没有评论,来说两句吧...