我们有一些基本的C#逻辑,它遍历目录并返回其中的文件夹和文件.当针对无法访问或无效的网络共享(\\ server\share\folder)运行时,代码似乎在从调用返回之前"挂起"大约30秒.
我想最终得到一个方法,它将尝试从给定路径获取文件夹和文件,但没有超时期限.换句话说,完全减少或消除超时.
我已经尝试过一些简单的事情,就像提前验证目录的存在一样简单,认为"不可用"的网络驱动器会很快返回false,但是没有按预期工作.
System.IO.Directory.Exists(path) //hangs
System.IO.DirectoryInfo di = new System.IO.DirectoryInfo(path); //hangs
Run Code Online (Sandbox Code Playgroud)
关于什么可以帮助我实现有效(并且希望管理)的解决方案的任何建议?
我正在测试远程共享(在Windows服务器上)中是否存在文件.用于测试的基础函数是WinAPI的GetFileAttributes,发生的情况是该函数在各种情况下可能需要过多的时间(几十秒),例如当目标服务器处于脱机状态,存在权限或DNS问题时等.
但是,在我的特定情况下,它始终是LAN访问,因此如果文件在不到1秒的时间内无法访问,那么通常无法通过等待几十秒来访问...
是否有替代GetFileAttributes不会失速?(除了在一个线程中调用它并在超时后杀死线程,这似乎带来了自己的问题)
可能的重复项:
加快不存在的网络共享的File.Exists的
速度。
我们需要将文本写入网络上的文件,但是可能存在该位置不存在的情况,而我们需要写入另一个位置。您如何快速检查网络位置是否存在?尝试使用“ try ... except”将文本写入不存在的位置需要花费30秒钟。当然必须有一个更快的方法吗?
如果有人可以给我一些指示,我将不胜感激。
谢谢!
我有这段代码让我发疯.
FUNCTION DiskInDrive(CONST DriveNumber: Byte): BOOLEAN;
VAR ErrorMode : Word;
BEGIN
RESULT:= FALSE;
ErrorMode := SetErrorMode(SEM_FAILCRITICALERRORS);
TRY
if DiskSize(DriveNumber) <> -1 { %%%% THIS IS VERY SLOW IF THE DISK IS NOT IN DRIVE !!!!!! }
THEN RESULT:= TRUE;
FINALLY
SetErrorMode(ErrorMode);
END;
END;
Run Code Online (Sandbox Code Playgroud)
它检查磁盘是否已准备好使用(以及提供的驱动器号是否与有效磁盘相对应).问题是,当我尝试访问断开连接的网络驱动器(映射为驱动器的网络文件夹)时,它会冻结大约10-30秒.
代码位于我创建的组件的构造函数中.
如何在不等待那么久的情况下检查驱动器?