Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Faster DirectoryExists function?

I use

DirectoryExists (const PathName : String);

to check if a directory is reachable from a computer or not. But if the directory does not exist and the path name is a network path, i.e.

\\computer1\Data

the method takes a very long time to return.

There must be a faster way to determine that a network folder is not reachable. Or can I configure some timeout parameter that DirectoryExists uses internally (I looked at the source code but it just delegates to GetFileAttributes which is defined in kernel32)?

Any ideas?

like image 989
jpfollenius Avatar asked Sep 17 '09 13:09

jpfollenius


2 Answers

There is no faster way:

any function accessing anything on a remote share will timeout when that share is not available.

If the cause of your timeouts is automatic disconnecting of shares, then these link may help you:

  • How Autodisconnect Works in Windows NT and Windows 2000
  • Mapped Drive Connection to Network Share May Be Lost

If the application can continue without the completion of the check, then you can put the check in a separate thread, and upon completion of the check, you can update your status in the UI.

Be aware that when you try a multi-threading way, that you have to disprove your code is free of race-conditions and memory leaks. Time-outs in combination with exceptions usually make that a hard task.

like image 50
Jeroen Wiert Pluimers Avatar answered Sep 28 '22 09:09

Jeroen Wiert Pluimers


There was the same question for C#: How to avoid network stalls in GetFileAttributes?

As codymanix said, use threads. The above link will show you how you can do it with delegates in C#. Don't know Delphi, but maybe you know how to convert the code?

like image 30
JRL Avatar answered Sep 28 '22 10:09

JRL