我必须检查一组文件路径是否代表现有文件.
它工作正常,除非路径包含不在当前网络上的计算机上的网络共享.在这种情况下,超时需要很长时间(30或60秒).
问题
有没有办法缩短非现有网络共享的超时?(我确信当他们确实存在时他们会很快回答,所以超时1秒就可以了)
有没有其他方法可以解决这个问题,而无需开始缓存并使算法更复杂?(即,我已经知道这些X网络共享不存在,跳过其余的匹配路径)
更新:使用线程工作,但不是特别优雅
public bool pathExists(string path)
{
bool exists = true;
Thread t = new Thread
(
new ThreadStart(delegate ()
{
exists = System.IO.File.Exists(path);
})
);
t.Start();
bool completed = t.Join(500); //half a sec of timeout
if (!completed) { exists = false; t.Abort(); }
return exists;
}
Run Code Online (Sandbox Code Playgroud)
此解决方案避免了每次尝试需要一个线程,首先检查哪些驱动器可以访问并将其存储在某处.
首先,您可以在IsDriveReady函数中设置"超时"值.我把它设置为5秒,但设置它适合任何适合你的.
下面使用3种方法:
- 第一个是WNetGetConnection API函数,它获取驱动器的UNC(\ servername\share)
- 第二个是我们的主要方法:Button1_Click事件
- 第三个是ping服务器的IsDriveReady功能.
这对我很有用!干得好:
Run Code Online (Sandbox Code Playgroud)'This API Function will be used to get the UNC of the drive Private Declare Function WNetGetConnection Lib …
我用
DirectoryExists (const PathName : String);
Run Code Online (Sandbox Code Playgroud)
检查是否可以从计算机访问目录.但是如果目录不存在且路径名是网络路径,即
\\computer1\Data
Run Code Online (Sandbox Code Playgroud)
该方法需要很长时间才能返回.
必须有一种更快的方法来确定无法访问网络文件夹.或者我可以配置DirectoryExists在内部使用的一些超时参数(我查看了源代码,但它只是委托给kernel32中定义的GetFileAttributes)?
有任何想法吗?