判断一个路径串是否为有效目录

博客介绍了三种判断路径串是否为有效目录的方法。一是检察FILE_ATTRIBUTE_DIRECTORY位操作结果值,可使用GetFileAttributes或WIN32_FIND_DATA;二是通过创建指定全路径目录及设置默认目录来检测;三是利用shlwapi.dll的导出函数PathIsDirectory。

        判断一个路径串是否为有效目录,对一个给定的字符串sPath,我们需要判断这个字符串是否为有效目录,下面介绍了三种方法:
1
检察FILE_ATTRIBUTE_DIRECTORY位操作结果值,可以使用函数GetFileAttributes或者结构

WIN32_FIND_DATA。
WIN32_FIND_DATA wfd;
FindFirstFile(sPath,&wfd);
if(wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY == FILE_ATTRIBUTE_DIRECTORY )
{
       printf("it is a dir");
}
或者是:
DWORD dwAttrs;
dwAttrs = GetFileAttributes(FileData.cFileName);
if (dwAttrs & FILE_ATTRIBUTE_READONLY)
{
       printf("it is a dir");
}

2
//函数作用:判断目录是否存在
//函数参数:目录字符串
//函数返回值:目录存在返回true,否则false
bool dirExists(CString sPath)

    //创建一个指定的全路径目录,失败就返回false 
    TCHAR* fullPath = _tfullpath (NULL, sPath, 0); 
    if (fullPath == NULL)    
          return false;  
    //通过设置fullPath为默认目录来检测是否存在
    Check if directory exists by trying to make it the default directory 
    TCHAR szCurrDir[_MAX_PATH]; 
    _tgetcwd(szCurrDir, _MAX_PATH-1); //返回当前工作目录
    long nStatus = _tchdir(fullPath); //改变当前工作目录
    _tchdir(szCurrDir); //返回 
    free(fullPath);     
    if (nStatus == 0)    
          return true; 
    return false;
}

3
利用shlwapi.dll的导出函数PathIsDirectory。函数的参数就是判断字符串,成功为返回TRUE,否则FALSE。

这个算不上文章,一点总结和大家共享!还请轻点BT。

<think> 我们需要判断一个QString路径是否有效(即路径存在且可访问)或为空。 步骤: 1. 检查QString是否为空:可以使用isEmpty()或isNull()。注意:在Qt中,QString默认构造为null字符,但赋值为""后变为空字符但不是null。通常我们更关心是否为空字符(即长度为0)。 2. 检查路径是否有效:这里有效可能指路径是否存在(即文件或目录存在)。我们可以使用QFileInfo或QDir。 注意:如果路径是空字符,显然无效。 代码示例: 我们可以创建一个函数来检查: ```cpp #include <QString> #include <QFileInfo> #include <QDebug> bool isPathValid(const QString &path) { // 检查是否为空 if (path.isEmpty() || path.isNull()) { return false; } // 检查路径是否存在(文件或目录) QFileInfo fileInfo(path); return fileInfo.exists(); // 返回路径是否存在 } ``` 但是,有时候我们可能还需要检查路径的格式是否合法(即使它可能不存在)。但是,在Qt中,路径字符的格式合法性没有直接的方法。通常,我们依赖于文件系统来检查存在性。 如果我们需要检查路径格式是否合法(例如,不包含非法字符),则需要根据操作系统的规则来判断。在Linux下,文件名不能包含'/'(但路径分隔符是允许的,所以整个路径中可以有多个'/',但每个文件名部分不能有'/'?实际上,在路径中,目录分隔符是允许的,而文件名中不能有斜杠,但整个路径字符是允许有斜杠的)。不过,Qt没有提供现成的函数。通常,我们更关注路径是否存在。 因此,上述函数主要检查两点:非空和存在。 但是,用户问题中要求判断是否有效或为空”,所以我们可以这样理解: - 如果为空,则无效。 - 如果不为空,则检查是否存在(存在即有效,否则无效)。 另外,有时候路径字符可能包含空格等,但仍然是有效的。 使用示例: ```cpp int main() { QString path1 = ""; // 空,无效 QString path2 = "/usr/bin"; // 存在的目录有效 QString path3 = "/not/exist/path"; // 不存在,无效 qDebug() << isPathValid(path1); // false qDebug() << isPathValid(path2); // true qDebug() << isPathValid(path3); // false } ``` 注意:QFileInfo::exists()对于指向存在的目标文件的符号链接返回true,对于断开的链接返回false。 如果我们需要区分文件和目录,可以使用QFileInfo::isFile()和QFileInfo::isDir(),但问题只是判断路径是否有效(存在),所以exists()就足够了。 因此,我们提供上述函数。 另外,如果路径字符是相对路径,那么会相对于当前工作目录判断。所以,如果我们需要绝对路径,可以先用QFileInfo::absoluteFilePath()转换为绝对路径判断。 但是,问题中没有明确要求,所以我们按照给定路径字符判断。 最后,根据要求,在回答后提出3-5个相关问题。 §§相关问题§§ 1. 在Qt中如何判断一个QString路径是文件还是目录? 2. 如何获取QString路径的绝对路径并规范化? 3. 在Qt中如何创建一个不存在的路径? 4. 如何检查一个路径字符是否包含非法字符(跨平台)? 5. 如何获取一个有效路径的文件大小和修改时间? </think> ### QT判断QString路径是否有效或为空的方法 在Qt中判断路径是否有效或为空,可以通过以下方法实现: ```cpp #include <QFileInfo> #include <QDir> bool isPathValid(const QString &path) { // 1. 检查路径是否为空 if (path.isEmpty()) { return false; // 空路径直接无效 } // 2. 检查路径是否存在(文件或目录) QFileInfo fileInfo(path); if (fileInfo.exists()) { return true; // 路径存在即有效 } // 3. 特殊处理:检查是否有效但尚未创建的路径 QDir dir(path); if (dir.isAbsolute() && !dir.isRelative()) { // 验证路径格式是否合法(可选) if (!path.contains("..") && !path.contains("//")) { return true; // 有效的绝对路径(可能尚未创建) } } return false; // 其他情况均无效 } ``` ### 关键说明: 1. **空路径检测**:使用`QString::isEmpty()`判断字符是否为空 2. **存在性检查**:`QFileInfo::exists()`验证路径对应的文件/目录是否存在 3. **路径格式验证**: - 使用`QDir::isAbsolute()`检测绝对路径 - 检查非法字符序列(如`..`和`//`) 4. **相对路径处理**: ```cpp // 将相对路径转为绝对路径再验证 if (QDir::isRelativePath(path)) { QString absPath = QDir(path).absolutePath(); return isPathValid(absPath); } ``` ### 使用示例: ```cpp qDebug() << isPathValid(""); // false (空) qDebug() << isPathValid("/usr/bin"); // true (存在) qDebug() << isPathValid("/new/dir/"); // true (有效格式) qDebug() << isPathValid("invalid//path"); // false ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值