Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ Windows文件名-如何检查文件名是否有效?_C++_C_Windows_Winapi_Filenames - Fatal编程技术网

C++ Windows文件名-如何检查文件名是否有效?

C++ Windows文件名-如何检查文件名是否有效?,c++,c,windows,winapi,filenames,C++,C,Windows,Winapi,Filenames,我想要一个函数,可能是其中一个,可以检查文件名是否有效。所谓有效,是指字符串中的字符是否都有效(例如,没有?,等)。但可悲的是,它没有任何功能。浏览网络,我发现了一些技术,没有一种是我喜欢的,也没有一种是可靠的 使用正则表达式检查文件名的内容 创建一个文件名,可能在系统的%TEMP%路径中。如果创建失败,则文件名(可能)无效。否则,它是有效的(因此,请删除该文件) 编写一个函数,检查文件名中是否存在无效字符(例如,?:*>) 函数的一种扩展形式是检查所有无效名称(如AUX、CON等),但这不

我想要一个函数,可能是其中一个,可以检查文件名是否有效。所谓有效,是指字符串中的字符是否都有效(例如,没有
等)。但可悲的是,它没有任何功能。浏览网络,我发现了一些技术,没有一种是我喜欢的,也没有一种是可靠的

  • 使用正则表达式检查文件名的内容
  • 创建一个文件名,可能在系统的
    %TEMP%
    路径中。如果创建失败,则文件名(可能)无效。否则,它是有效的(因此,请删除该文件)
  • 编写一个函数,检查文件名中是否存在无效字符(例如,
    ?:*>
函数的一种扩展形式是检查所有无效名称(如
AUX
CON
等),但这不是问题(至少目前是这样)

是否有任何我可能遗漏的记录/未记录的函数,可以可靠地检查文件名(路径名)是否有效。

编辑:该函数现在已弃用,不再受支持。有关详细信息,请参阅链接页面末尾的
要求
部分


谢谢康纳,谢谢你的邀请。对于其他读取器,函数名为。我使用它实现了以下内容:

bool IsLegalFileName(LPCWSTR filename)
{
    WCHAR valid_invalid[MAX_PATH];
    wcscpy_s(valid_invalid, filename);

    int result = PathCleanupSpec(nullptr, valid_invalid);

    // If return value is non-zero, or if 'valid_invalid' 
    // is modified, file-name is assumed invalid
    return result == 0 && wcsicmp(valid_invalid, filename)==0;
}

有一个很好的小函数可以为您删除非法字符:从技术上讲,您无法判断文件名是否无效,而不是路径名,因为文件名的有效性也取决于底层文件系统。@gha.st,这是真的,但操作系统会知道。而且,我只询问操作系统提供的函数。谢谢@BLUEPIXY,但是
PathGetCharType
并不能解决问题。它适用于路径,但不(仅)适用于文件名。如果这为您解决了问题,您可以接受自己的答案。
PathCleanupSpec
去掉表示要使用NTFS数据流的冒号,例如
“file.ext:ads”
“file.ext:ads:$data”
,用于名为“ads”的记录。
“file.ext”
的默认值是匿名流
“file.ext::$DATA”
。请注意,PathCleanupSpec被列为不推荐使用。它可能不存在于Windows的未来版本中。