C++ 判断路径为文件夹还是文件

文章介绍了如何在Unix/Linux系统中使用stat函数和在Windows系统中使用FindFirstFileA函数来判断文件是目录还是普通文件。stat函数通过检查文件的模式来区分文件类型,而FindFirstFileA则通过查询文件属性实现这一功能。

stat函数

头文件


#include <sys/stat.h>

 
struct stat s;
char* path = "D:\\test.txt";
 
if (stat(path,&s)==0){
  if(s.st_mode & S_IFDIR){
    std::cout<<"it's a directory"<<std::endl;
  }else if (s.st_mode & S_IFREG){
    std::cout<<"it's a file"<<std::endl;
  }else{
    std::cout<<"not file not directory"<<std::endl;
  }
}else{
  std::cout<<"error, doesn't exist"<<std::endl;
}

语法

int stat (Path, Buffer)
const char *Path;
struct stat *Buffer;

Path 

指定标识文件的路径名。根据所使用的接口,此名称的解释不同。如果指定了DirFileDescriptor并且Path是一个相对路径名,那么Path被认为是相对于DirFileDescriptor指定的目录的。

Buffer

指定指向在其中返回信息的状态结构的指针。stat结构在<sys/stat.h>文件中描述。

返回值

成功完成后,返回值0。否则,返回-1的值,并设置errno全局变量来指示错误。

Error Codes

EACCES路径前缀的一个组件的搜索权限被拒绝
ENAMETOOLONGPOSIX_NO_TRUNC标志生效时,路径前缀的长度超过了PATH_MAX标志值或路径名超过了NAME_MAX标志值。
ENOTDIR路径前缀的组件不是目录。
EFAULTPath或Buffer参数都指向进程分配的地址空间之外的位置
ENOENT以Path参数命名的文件不存在
EOVERFLOW文件大小大于Buffer参数所指向的状态结构中所能表示的最大值。

FindFirstFileA函数

头文件

#include <windows.h>
using namespace std;

WIN32_FIND_DATAA FindFileData;
FindFirstFileA("D:\\test.txt",&FindFileData);
if(FindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
{
    std::cout<<"directory"<<std::endl;
}
else
{
    std::cout<<" file "<<std::endl;
}

语法

HANDLE FindFirstFileA(
  [in]  LPCSTR             lpFileName,
  [out] LPWIN32_FIND_DATAA lpFindFileData
);

参数

[in] lpFileName

目录或路径以及文件名。 文件名可以包含通配符,例如星号 (*) 或问号 (?) 。

此参数不应为 NULL,例如,空字符串或缺少终止 null 字符) 的字符串,或尾随反斜杠 (\) 结尾的字符串 (。

如果字符串以通配符、句点 (.) 或目录名称结尾,则用户必须具有对路径上根目录和所有子目录的访问权限。

在此函数的 ANSI 版本中,名称限制为 MAX_PATH 个字符。 若要将此限制扩展到 32,767 宽字符,请调用函数的 Unicode 版本,并将“\\?\”前面附加到路径。 有关详细信息,请参阅 命名文件

提示从 Windows 10 版本 1607 开始,对于此函数的 unicode 版本 (FindFirstFileW) ,可以选择加入以删除MAX_PATH字符限制,而无需附加“\\?\”。 有关详细信息,请参阅 命名文件、路径和命名空间 的“最大路径限制”部分。

[out] lpFindFileData

指向 WIN32_FIND_DATA结构的指针 ,该结构接收有关找到的文件或目录的信息。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值