我有以下程序来读取存在的文件:
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);
}
根据 documentation,在这个特定文件上,我得到 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 时遇到了这个确切的问题。我的文件的修改日期是 星期日, 5 月 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 中的回归。
关于c++ - _stat 返回不可能的 errno 代码 132,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32786391/