【问题标题】:C++ PathFileExists limited to 260 charsC++ PathFileExists 限制为 260 个字符
【发布时间】:2012-12-14 11:39:50
【问题描述】:

根据MSDNPathFileExists()函数只支持文件路径

我想检查远程位置是否存在路径。现在合法地我可以创建一个名称为 256 个字母长的文件,当我添加服务器名称时,总长度超过 260,因此PathFileExists() 无法使用它。

还有什么其他选项可以检查文件是否存在?

【问题讨论】:

  • 这可能会有所帮助:stackoverflow.com/questions/13842411/…
  • 我会试试看它是否适合我,但我仍然更喜欢使用直接方法来检查存在而不是这种间接方式。必须有一个 API 可以处理长路径
  • 等效地,调用FindFirstFile。由于您只对一个文件感兴趣,请不要致电FindNextFile。 “查找”是非常直接的 IMO。
  • C 字符串和 MAX_PATH 的诅咒非常猖獗。原生 Windows 操作系统支持最多 32,766 个字符的路径,您可以在 win32 路径名前加上 `\\?\` 将其转换为原生路径名。但是您必须仔细挑选 api 函数,PathFileExists() 受 MAX_PATH 限制。 Kernel32 函数很好。
  • 我会通过的。解释这类事情只会引起遇到这种限制的用户的愤怒。他们确实射杀了这里的信使。

标签: c++ winapi


【解决方案1】:

由于所有Shell Path Handling Functions 都被限制为MAX_PATH - 1 个字符,如果您需要支持更长的文件名,您将不得不使用kernel32 函数。您的选择是:

  1. FindFirstFile
  2. CreateFile
  3. GetFileAttributes

虽然FindFirstFile 相当简单,但如果函数没有返回错误代码,则需要调用FindClose。如果您在网络上查询文件,这会触发额外的网络往返。 CreateFile 也会触发额外的网络往返,您必须清理 HANDLE 调用 CloseHandle。另外它可能会给wrong answer

如果您需要支持长于MAX_PATH 字符的文件名,则建议使用GetFileAttributes 来查询文件是否存在。

【讨论】:

  • GetFileAttributes 将返回我的属性,即使传递了目录路径。我将无法区分文件和目录。
  • @Nitin bool isDirectory = ( GetFileAttributes( pathName ) & FILE_ATTRIBUTE_DIRECTORY ) != 0;
  • 对您的方法的一个小补充。确保还检查符号链接或FILE_ATTRIBUTE_REPARSE_POINT 标志。对于“真实”目录,它应该关闭。还要确保检查INVALID_FILE_ATTRIBUTESGetFileAttributes 也可能返回。
  • 在 WIn7 x64 上,我注意到使用 SysInternals Process Monitor GetFileAttributes 会导致三个操作(打开、查询、关闭)。而PathFileExists 只产生一个。
  • 您的回答暗示 FindFirstFile 和 Create file 都打开和关闭句柄,而 GetFileAttribute 没有。
猜你喜欢
  • 1970-01-01
  • 2014-05-11
  • 2021-12-19
  • 2011-06-08
  • 2013-04-29
  • 1970-01-01
  • 1970-01-01
  • 2012-04-30
  • 2016-05-29
相关资源
最近更新 更多