10

问题

  • posix 宏 S_ISREG、S_ISDIR 等是否仅适用于 linux?我需要找出原因,因为我正在尝试编译CURL,并且它正在尝试在 Windows 上使用它们
  • 我可以使用哪些包含文件在 Windows 上访问它们。

这是有问题的代码

/*we ignore file size for char/block devices, sockets etc*/
if(S_ISREG(fileinfo.st_mode))
   uploadfilesize= fileinfo.st_size;
}

它会导致错误

error LNK2019: unresolved external symbol _S_ISREG referenced in function _operate file tool_operate.obj

它们在以下问题中被引用

显然 S_ISREG() 是一堆 posix 宏的一部分,显然应该告诉我们文件是否是“常规文件”,但我发现的所有示例都有 linux 特定的包含文件。

4

4 回答 4

14

目前 curl 7.21.5 在 setup.h 中定义了这个:

#if !defined(S_ISREG) && defined(S_IFMT) && defined(S_IFREG)
#define S_ISREG(m) (((m) & S_IFMT) == S_IFREG)
#endif
于 2014-03-14T12:22:09.407 回答
4

在检查了 Microsoft 的 sys/stat.h 之后,我发现 @OliverZendel 的答案的以下修改对我有用,使用 Visual Studio 2017,希望也适用于其他编译器:

// Windows does not define the S_ISREG and S_ISDIR macros in stat.h, so we do.
// We have to define _CRT_INTERNAL_NONSTDC_NAMES 1 before #including sys/stat.h
// in order for Microsoft's stat.h to define names like S_IFMT, S_IFREG, and S_IFDIR,
// rather than just defining  _S_IFMT, _S_IFREG, and _S_IFDIR as it normally does.
#define _CRT_INTERNAL_NONSTDC_NAMES 1
#include <sys/stat.h>
#if !defined(S_ISREG) && defined(S_IFMT) && defined(S_IFREG)
  #define S_ISREG(m) (((m) & S_IFMT) == S_IFREG)
#endif
#if !defined(S_ISDIR) && defined(S_IFMT) && defined(S_IFDIR)
  #define S_ISDIR(m) (((m) & S_IFMT) == S_IFDIR)
#endif
于 2020-06-14T11:15:35.260 回答
3

在 Windows 上尝试添加下划线 ( _S_ISREG)。在 MinGW 的库中,S_ISREG宏也可以在<sys/stat.h>

也许你应该检查你的配置宏。

于 2012-06-28T06:16:41.013 回答
3

windows上没有这样的东西,你可以使用FindFirstFile,FindNextFile win32 api,返回结构包含类似但不一样的东西。

如果你使用 gcc/mingw 库,它们有一个 stat() 模拟。您需要为该宏包含 sys/stat.h。

于 2012-06-28T06:59:38.020 回答