【问题标题】:Win32: Work-around for GetFileAttributes()Win32:GetFileAttributes() 的解决方法
【发布时间】:2013-01-31 19:09:29
【问题描述】:

我注意到这些年来已经出现了几次的问题,并且似乎在我们当前版本的 Windows 7 下经常发生。

当我使用 ::GetFileAttributes(filename) 测试文件是否存在时,我经常返回 INVALID_FILE_ATTRIBUTES,GetLastError() 是 ERROR_PATH_NOT_FOUND (3)。

但是,文件确实存在,路径存在,卷存在 - 它的 H:\Foo\Bar - 这是网络共享上的一个文件夹,在我的机器上映射到 H:。

如果我打开一个命令窗口,它可以看到它。如果我使用 Windows 资源管理器导航到该文件夹​​,它可以看到它。

如果我在运行我们的应用程序之前执行这些操作,我们可以看到它。

但是,如果我在重新启动后,在任何尝试查看 H:\ 之前先运行我们的应用程序,则会重复出现上述错误。

在我看来,Windows 一直在“帮助”我,当给定的共享映射尚未重新连接此会话(它设置为自动重新连接)时,立即返回 ERROR_PATH_NOT_FOUND。不用说,这很烦人。我是否可以进行另一个 API 调用来“确定文件/文件夹 X 是否存在?”

【问题讨论】:

  • 我不认为该错误与您的网络中断有关,因为您会得到不同的错误代码。尝试将文件名记录到文件并每次返回结果。也许你会发现路径有时是无效的,因为内存损坏或者路径空白。
  • 我在我的开发环境中运行它。可以看到路径有效,返回码一致 3. LAN 配置为简单的点对点系统,“服务器”是简单的 XP Pro 盒子,具有不受保护的共享(内部,D :\主文件夹)。这个系统已经工作了很多年,除了偶尔我会得到那个错误,如果我在运行我们的应用程序之前(或在加载开发环境以在调试模式下运行之前)简单地访问映射的驱动器,它总是会清除。

标签: windows visual-c++ winapi


【解决方案1】:

您是否将应用程序作为服务运行?或者作为其他用户?可能是权限问题。它使用的凭据可能没有读取该目录的权限。

【讨论】:

  • 在 Windows 7 x64 Business 计算机上以我的开发人员(管理员)登录身份运行(我是本地管理员,不涉及域)。
  • 我认为你是对的。由于我一直在调试我们的安装程序,因此最近我不得不允许 VS2008 以“附加权限”重新启动几个会话。所以这可能是一个不同的用户身份,一个没有 H: 映射的用户身份。似乎是 Win7(可能还有 Vista)中的一个错误,因为提升权限不应导致应用程序不再看到与提升权限的用户相同的驱动器...
  • 确认:重新启动 PC 并立即运行我们应用的零售副本,或使用非提升权限对其进行调试,导致行为正确(找到文件和路径)。
  • @Mordachai 实际上,提升权限确实会导致应用程序不再看到相同的驱动器,因为 Windows 在启用 UAC 时认为它是两个不同的会话。本文中的更多详细信息:Some Programs Cannot Access Network Locations When UAC Is Enabled。正如文章所提到的,有一个注册表调整可以使 Windows 在提升和非提升会话之间复制映射驱动器。
【解决方案2】:

需要恢复驱动器连接,这是由 shell 自动完成的。它曾经由 WNetRestoreConnectionW() 完成,但该功能已在 Vista 中删除。我认为你需要这样做this way now

使用 UNC 路径 (\\share\dir\file) 可能是更好的解决方法。

【讨论】:

  • 谢谢。这些年来我已经看到了我最初发布的行为,这篇文章听起来可以让我解决问题的这方面。
【解决方案3】:

更简单的方法是将ShellExecuteEx 与标志SEE_MASK_CONNECTNETDRV 一起使用。

【讨论】:

  • 我会执行什么?我正在寻找一个文件的存在,没有运行任何东西......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-06-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多