我正在使用这段代码
long filesize (const char * filename)
{
ifstream file (filename, ios::in|ios::binary);
file.seekg (0, ios::end);
return file.tellg();
}
以字节为单位返回文件大小。 但是我没有读取权限的文件导致返回-1。 有没有办法使用c ++或c来返回文件和目录的大小,即使在没有读取权限的情况下也能正常工作? 我正在寻找一段时间,但未能找到可靠的解决方案。
答案 0 :(得分:3)
当前的c ++标准库不提供从文件系统查询文件大小的可能性。
将来,当c ++ 17发布时,c ++标准库将具有an API for basic file system operations。使用该API,这不应该要求对文件的读取权限(当然,您确实需要路径中所有父目录的权限),但是,我不认为该标准提供了关于不需要权限的任何保证:
return std::filesystem::file_size(filename);
在您的标准库支持即将推出的标准之前(某些标准库已经拥有experimental/filesystem technical specification的实验支持),您需要求助于OS specific API或a non-standard wrapper library。
答案 1 :(得分:1)
好吧,如果没有读取权限,您的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合规性)(当然,您需要访问权限才能读取目录内容信息)。
答案 2 :(得分:1)
在POSIX系统上,您可以使用stat。
要点:
#include <sys/stat.h>
int stat(const char *restrict path, struct stat *restrict buf);
因此,您声明一个 stat 结构来保存结果,并将指针传递给stat:
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
相关联(请参阅experimental::filesystem linker error)。