我有以下程序来读取存在的文件:
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: %d\n", err);
}
在这个特定文件中,我收到err == 132
_stat
根据documentation,只能返回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
),那么我会收到相同的错误,这会让我相信其权限或所有权问题。
导致此错误的原因是什么?
答案 0 :(得分:2)
从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年之前的文件时间戳似乎是不合理的,但另一方面它可能(人为地)并且偶尔偶然发生。感觉就像Visual Studio中的回归一样。
答案 1 :(得分:0)
您查找错误的链接实际上包含Windows API错误代码,这些代码与C标准库的错误代码不同。
<errno.h>
,表示132对应于EOVERFLOW。快速查看我的VS版本中的CRT源代码表明,当文件大小太大而无法以32位整数表示时,可能会发生这种情况。根据你的描述,我不确定你的问题是否存在(除非原始路径是特殊的,符号链接,......?)但你应该尝试调试器。