我正在使用这段代码
long filesize (const char * filename)
{
ifstream file (filename, ios::in|ios::binary);
file.seekg (0, ios::end);
return file.tellg();
}
为了返回以字节为单位的文件大小。但是,没有读取权限的文件会导致返回 -1。有没有办法使用 c++ 或 c 返回文件和目录的大小,即使在没有读取权限的情况下也可以在文件上运行?我正在寻找一段时间,但未能找到可靠的解决方案。
当前的 c++ 标准库不提供从文件系统查询文件大小的可能性。
将来,当 c++17 发布时,c++ 标准库将具有用于基本文件系统操作的 API。使用该 API,这应该不需要对文件的读取权限(但当然,您确实需要对路径中的所有父目录的权限),尽管我认为该标准没有提供任何关于不需要权限的保证:
return std::filesystem::file_size(filename);
在您的标准库支持即将推出的标准之前(某些标准库已经对实验/文件系统技术规范提供了实验性支持),您将需要求助于特定于操作系统的 API 或非标准包装库。
好吧,如果没有读取权限,您的file
将处于错误状态,调用file.seekg()
也会导致错误状态:
long filesize (const char * filename)
{
ifstream file (filename, ios::in|ios::binary);
if(file) { // Check if opening file was successful
file.seekg (0, ios::end);
return file.tellg();
}
return -1; // <<<< Indicate that an error occured
}
如果文件不允许您打开它,您仍然可以使用 stat()
检查目录结构并获取有关文件的信息。但这依赖于平台(POSIX 合规性)(当然,您需要访问权限才能读取目录内容信息)。
在 POSIX 系统上,您可以使用 stat。
总结:
#include <sys/stat.h>
int stat(const char *restrict path, struct stat *restrict buf);
因此,您声明一个统计信息结构来保存结果,并将指针传递给统计信息:
struct stat buf;
stat(filename, &buf);
大小(以字节为单位)包含在 buf.st_size
中。
如果你的标准库实现包含<experimental/filesystem>
(它应该来自 C++17 的实验),你可以改用它。 #include <experimental/filesystem>
,然后使用 std::experimental::filesystem::file_size(filename)
代替 filesize
函数。(这也返回以字节为单位的大小。它只是在 POSIX 系统上调用 stat
函数。
对于 GCC,您需要与 -lstdc++fs
链接(请参阅实验::文件系统链接器错误)。