_stat返回不可能的errno代码132

时间:2015-09-25 16:10:56

标签: c++ windows visual-c++ file-io

我有以下程序来读取存在的文件:

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.XMLLOG2.XML),那么我会收到相同的错误,这会让我相信其权限或所有权问题。

导致此错误的原因是什么?

2 个答案:

答案 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包含C运行时库的源代码(在C:\ Program Files(x86)\ Microsoft Visual Studio VERSIONID \ VC \ crt \ src之类的路径中),因此您应该使用调试器进入它以查找在你的情况下发生了什么。

快速查看我的VS版本中的CRT源代码表明,当文件大小太大而无法以32位整数表示时,可能会发生这种情况。根据你的描述,我不确定你的问题是否存在(除非原始路径是特殊的,符号链接,......?)但你应该尝试调试器。