_stat返回不可能的errno代码132

_stat returns impossible errno code 132

本文关键字:errno 代码 不可能 stat 返回      更新时间:2023-10-16

我有下面的程序来读取一个存在的文件:

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.XMLLOG2.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位整数表示时,可能会发生这种情况。根据您的描述,我不确定这可能是您的问题(除非原始路径是特殊的,符号链接,…?),但您应该尝试调试器。