c++ - _stat 返回不可能的 errno 代码 132

标签 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);
}

根据 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.XMLLOG2.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/

相关文章:

c++ - LVN_ITEMCHANGING - 区分用户输入

windows - IE6 把 jar 变成 zip

com - 如何从 VC++ .EXE 应用程序调用 COM DLL(在 VC++ 中)的函数?

c++ - 我将如何着手将物理学应用于带有子弹的玩家?

C++ 成员函数指针

c++ - std::for_each 似乎正在清理 std::string

c++ - 我可以用一些宏恢复 MSVC 16.6 中删除的 std::result_of 吗?

c++ - 有没有办法在更改与 HDC 关联的位图大小后更新 Graphics 对象?

windows - Spyder 界面图标在 Windows 10 的高分辨率屏幕上非常小

multithreading - 代替hash_map使用的数据结构