更快的DirectoryExists功能?

jpf*_*ius 15 delphi networking delphi-2009

我用

DirectoryExists (const PathName : String);
Run Code Online (Sandbox Code Playgroud)

检查是否可以从计算机访问目录.但是如果目录不存在且路径名是网络路径,即

\\computer1\Data
Run Code Online (Sandbox Code Playgroud)

该方法需要很长时间才能返回.

必须有一种更快的方法来确定无法访问网络文件夹.或者我可以配置DirectoryExists在内部使用的一些超时参数(我查看了源代码,但它只是委托给kernel32中定义的GetFileAttributes)?

有任何想法吗?

Jer*_*ers 19

没有更快的方法:

当该共享不可用时,访问远程共享上任何内容的任何函数都将超时.

如果您的超时原因是自动断开共享,那么这些链接可能会帮助您:

如果应用程序可以在没有完成检查的情况下继续,那么您可以将检查放在单独的线程中,并且在完成检查后,您可以在UI中更新您的状态.

请注意,当您尝试多线程方式时,您必须反驳代码,不受竞争条件和内存泄漏的影响.超时与异常相结合通常会使这成为一项艰巨的任务.

  • @Michael - 嗯,你所做的就是把检查放在一个线程中,就像这个答案所说的那样.为什么在主线程中实现超时证明这个答案是错误的?如果有的话,你的代码证明这个答案是正确的. (2认同)
  • @Michael 1)您的代码只能证明在一段时间后可以放弃确定某个目录是否存在.这是不可靠的,但那是你的设计.时间可能比准确性更重要.2)死链接可能会使链接只回答错误,但这不是这种情况.FWIW链接可能是[这个](https://blogs.msdn.microsoft.com/openspecification/2013/03/19/cifs-and-smb-timeouts-in-windows/)或[this](https:// blogs.msdn.microsoft.com/openspecification/2013/03/27/smb-2-x-and-smb-3-0-timeouts-in-windows/).3)*"没有更快的方式"*的源代码?不需要. (2认同)

JRL*_*JRL 6

C#也存在同样的问题: 如何避免GetFileAttributes中的网络停顿?

正如codymanix所说,使用线程.上面的链接将向您展示如何使用C#中的代理进行操作.不知道Delphi,但也许你知道如何转换代码?

  • (线程只有在你可以在paralel中执行某些操作时才有用.如果你的下一个动作依赖于共享(例如加载配置),在线程情况下你只能向用户显示一些动作,它不会加速起来) (4认同)

cod*_*nix 5

如果您测试大量目录,则应使用线程并行执行所有查询,因为对于网络共享,通常需要很长时间.