在Linux下,如果想判断一个文件的类型,可以这样写。
1.使用系统函数
cpp
#include <iostream>
#include <sys/stat.h>
bool is_txt_file(const std::string& path)
{
struct stat its_stat;
if (stat(path.c_str(), &its_stat) == 0) //是否存在
{
if (its_stat.st_mode & S_IFREG)
{
std::cout<<"file "<<path<<" is txt file\n";
return true;
}
else
{
std::cout<<"file "<<path<<" is not txt file\n";
return true;
}
}
std::cout<<"file "<<path<<" is not exist\n";
return false;
}
int main()
{
std::string path;
std::cout<<"input a file path to judge if it exist:";
std::cin>>path;
is_txt_file(path);
return false;
}
编译输出的效果为:
g++ -o cppexist cppexist.cpp ./cppexist
input a file path to judge if it exist:cppexist
file cppexist is txt file
$ ./cppexist
input a file path to judge if it exist:22
file 22 is not exist
$ ./cppexist
input a file path to judge if it exist:/usr/bin
file /usr/bin is not txt file
其中if (stat(path.c_str(), &its_stat) == 0)这句判断文件是否存在,
if (its_stat.st_mode & S_IFREG)这句判断文件的类型。
S_IFREG:普通文件,类似的标志还有,可用来判断不同的文件类型。
|----------|------|
| S_IFREG | 文本文件 |
| S_IFDIR | 目录 |
| S_IFLNK | 符号链接 |
| S_IFCHR | 字符设备 |
| S_IFBLK | 块设备 |
| S_IFIFO | 管道文件 |
| S_IFSOCK | 套接字 |
上面的函数可进行扩充,从而判断出具体的文件类型。
2.使用C++17中的函数
随着C++的发展,它也增加了判断文件类型的函数。
cpp
#include <filesystem>
void cpp_file_type(const std::string &path)
{
try{
auto status = std::filesystem::status(path);
if (std::filesystem::is_regular_file(status) || status.type() == std::filesystem::file_type::regular)
{
std::cout<<path<<" is txt file\n";
}
}catch (const std::filesystem::filesystem_error &e)
{
std::cout<<e.what()<<std::endl;
}
}
$ ./cppexist
input a file path to judge if it exist:cppexist
file cppexist is txt file
cppexist is txt file
上面是判断文本文件的方法,
方法1:std::filesystem::is_regular_file(status)这是使用函数判断。
方法2:status.type() == std::filesystem::file_type::regular这是使用类型值判断。
它还有其他函数判断不同文件类型。
|--------------------------------------------------------------------------------------------------------------|----------------------|------|
| is_regular_file() | file_type::regular | 文本文件 |
| is_directory() | file_type::directory | 目录 |
| is_block_file() | file_type::block | 块设备 |
| is_character_file() | file_type::character | 字符设备 |
| is_fifo() | file_type::fifo | 管道文件 |
| is_socket() | file_type::socket | 套接字 |
| is_symlink() | file_type::symlink | 符号链接 |
| exists() | - | 是否存在 |
总结
通过一个文本判断函数,引申出不同类型的判断。可以使用linux的系统函数来判断文件类型,也可以使用C++的函数来判断文件类型。