_stat返回不可能的errno代码132
_stat returns impossible errno code 132
我有下面的程序来读取一个存在的文件:
const char *path = "C:\Users\myname\AppData\Roaming\Technology\plus\fs\D\TECH\CUSTOM\LOG.XML";
struct _stat lInfo;
int err = _stat(path, &lInfo);
if (err == 0) {
return (lInfo.st_mode & _S_IFDIR) != 0;
} else {
_get_errno(&err);
printf("Error: %dn", err);
}
在这个特定的文件上,我得到err == 132
,其中_stat
,根据文档,只能返回ENOENT (2)
和EINVAL (22)
。错误码132为EOVERFLOW
。如果我完全复制文件并将其重命名为LOG2.xml
并相应地替换这一行:
const char *path = "C:\Users\myname\AppData\Roaming\Technology\plus\fs\D\TECH\CUSTOM\LOG2.XML";
那么一切都很好。(即。errno
是0,我得到文件信息)。如果我只是重命名原始文件(从LOG.XML
到LOG2.XML
),那么我得到同样的错误,导致我相信这是一个权限或所有权问题。
这个错误的原因是什么?
我在从Visual Studio 2010 SP1Rel升级到Visual Studio 2015 Update 2时遇到了这个确切的问题。我的文件有一个修改日期的Sunday, May 13, 1601, 5:53:31 PM
,似乎stat
不再适用于1970年之前的日期。
调试通过vc14的ucrt,我相信下面的代码行是相关的:
corecrt_internal_time.h
#define _BASE_YEAR 70 // The epoch year (1970)
loctotime.cpp: common_loctotime_t ()
yr -= 1900;
_VALIDATE_RETURN_NOEXC(yr >= _BASE_YEAR && yr <= time_traits::max_year, EINVAL, invalid_time)
在文件上运行touch
修复了这个问题。
一方面,拥有1970年之前的文件时间戳似乎是相当不合理的,但另一方面,这是可能的(人为地),并且偶尔会偶然发生。
您查找错误的链接实际上包含Windows API错误代码,这与C标准库的错误代码不同。
- 你需要的头是
<errno.h>
,这表明132对应于EOVERFLOW。 - VS包含C运行时库的源代码(在类似C:Program Files (x86)Microsoft Visual Studio VERSIONIDVCcrtsrc的路径中),所以你应该使用调试器进入它以找出在你的情况下发生了什么。
在我的VS版本中快速查看CRT源代码表明,当文件大小太大而无法用32位整数表示时,可能会发生这种情况。根据您的描述,我不确定这可能是您的问题(除非原始路径是特殊的,符号链接,…?),但您应该尝试调试器。
相关文章:
- C++我的数学有什么问题,为什么我的代码不能正确循环
- 代码在main()中运行,但在函数中出现错误
- 在VS代码中交叉编译Windows与Linux上的MinGW的SDL程序
- 编译包含字符串的代码时遇到问题
- 我在c++代码中生成了一个运行时#3异常
- 如何在linux终端中同时编译和运行c++代码
- 为cl.exe(Visual Studio代码)指定命令行C++版本
- 在Linux for Windows上编译C++代码时出错
- 我的字符计数代码计算错误.为什么
- 孤立代码块在结构中引发异常
- 在编译C++代码(具有dlib和opencv)到WASM时面临问题
- 为什么我的C#代码在调用回C++COM直到Task时会暂停.等待/线程.加入
- 处理小于cpu数据总线的数据类型.(c++转换为机器代码)
- 此代码是否违反一个定义规则
- 为什么我的代码在输出中增加了93天
- 我的简单if-else语句是如何无法访问的代码
- 使用动态分配的数组会导致代码分析发出虚假的C6386缓冲区溢出警告
- 为什么在这个代码结束循环中没有得到结束
- _stat返回不可能的errno代码132
- vim的Youcompleteme插件无法为errno.h中的错误代码提供补全