在没有 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 结构,在其文档中它引用了 ReadFileWriteFile 方法。另一方面,GetFileAttributes 的变体没有提到OVERLAPPED 或异步 I/O。因此,假设它始终是同步的似乎是安全的。

【讨论】:

【参考方案2】:

AFAIK 不,通常没有简单的方法。

如果您的服务器配置为响应 ping,您可以使用IcmpSendEcho API 在访问它的共享文件之前 ping 服务器,API 非常简单并且它接受超时。

如果您的服务器不响应 ping(默认情况下现代版本的 Windows 不响应),您可以编写一个函数尝试连接到 TCP 端口 135 或 445,如果已连接则关闭连接并返回成功,如果失败返回错误。这将允许您实现比默认值更短的超时。

在这两种方法中,您都需要将网络驱动器路径解析为服务器的名称,参见例如GetVolumePathNameAPI。

【讨论】:

以上是关于在没有 20 秒超时的情况下确定文件是不是存在于网络驱动器上的主要内容,如果未能解决你的问题,请参考以下文章

PHP会话默认超时[重复]

PHP会话默认超时[重复]

即使在 ICMP 端口无法访问的情况下,select() 超时 3 秒

在调试模式下以编程方式设置 WCF 超时

加快非现有网络共享的 File.Exists

Python 从 IP 查找主机名,超时 1 秒