在没有 20 秒超时的情况下确定文件是不是存在于网络驱动器上
Posted
技术标签:
【中文标题】在没有 20 秒超时的情况下确定文件是不是存在于网络驱动器上【英文标题】:Determining if a file exists on a network drive without a 20 second timeout在没有 20 秒超时的情况下确定文件是否存在于网络驱动器上 【发布时间】:2013-04-19 14:46:51 【问题描述】:有没有一种简单的方法可以确定远程系统上的文件是否存在,如果不存在则挂起 20-25 秒?
类似...的功能
PathFileExists();
GetFileAttributes();
...不允许您设置超时持续时间,因此当文件不存在时,您最终会等待很长时间。我认为可以将这些调用之一放入线程并将线程设置为在 1 秒(或其他任何时间)后过期,但我更喜欢使用轻量级的本机 Windows 函数或 boost 函数,而不是不优雅的线程解决方案.
【问题讨论】:
任何boost
函数都会在某些 Windows API 上中继...
我相信他们中的许多人确实会这样做。我只是不太了解 boost,不知道它是否包含一个可以有效实现我提到的线程解决方法的函数(例如)。
没有。检查任何资源是否可用的唯一有效方法是尝试以正常方式使用它。任何其他技术都可能导致时间窗口问题。
【参考方案1】:
证明是否定的有点困难,但我认为不存在这样的方法。
普通的 Windows 异步 I/O 方法使用 OVERLAPPED
结构,在其文档中它引用了 ReadFile
和 WriteFile
方法。另一方面,GetFileAttributes
的变体没有提到OVERLAPPED
或异步 I/O。因此,假设它始终是同步的似乎是安全的。
【讨论】:
【参考方案2】:AFAIK 不,通常没有简单的方法。
如果您的服务器配置为响应 ping,您可以使用IcmpSendEcho
API 在访问它的共享文件之前 ping 服务器,API 非常简单并且它接受超时。
如果您的服务器不响应 ping(默认情况下现代版本的 Windows 不响应),您可以编写一个函数尝试连接到 TCP 端口 135 或 445,如果已连接则关闭连接并返回成功,如果失败返回错误。这将允许您实现比默认值更短的超时。
在这两种方法中,您都需要将网络驱动器路径解析为服务器的名称,参见例如GetVolumePathName
API。
【讨论】:
以上是关于在没有 20 秒超时的情况下确定文件是不是存在于网络驱动器上的主要内容,如果未能解决你的问题,请参考以下文章