为什么使用Linq从远程文件夹获取文件被挂起



我正在尝试获取LastWriteTime排序的文件夹中的文件。

当访问本地路径(C:\MyFolder)时,代码运行得非常快,但当访问远程路径(\\MyServer\MyFolder)时,代码会挂起

Dim myOrderedList As List(Of String) = (From item In IO.Directory.GetFiles(strFolderSource) _
Let file = New IO.FileInfo(item) _
Order By file.LastWriteTime _
Select item).ToList()

这个代码应该工作吗?不允许使用此方法从远程文件夹获取文件?我可以使用哪种替代代码在不挂起的情况下获得相同的结果?

编辑(2019-01-18 16:32):

抱歉,伙计们,我已经尝试了Rango提出的解决方案,但仍然是一样的。最后,我创建了一个小型日志系统来捕捉导致问题的步骤,并意识到这一切都是凭据问题。

就在我发布代码之前,我进行了一次NET USE以授予对远程计算机的访问权限,并执行了NET USE,但无论出于何种原因,GetFiles()都会因为登录失败而失败:未知用户名或错误密码。那么,在调用GetFiles()之前,我可以确保网络使用的凭据吗?

也许是用停顿或类似的方式?

完整代码:

Dim processInfo As New System.Diagnostics.ProcessStartInfo()
processInfo.FileName = "C:WINDOWSsystem32net"
processInfo.Arguments = "net use \MyServerIPC$ ""password"" /USER:Username"
System.Diagnostics.Process.Start(processInfo)
Dim myOrderedList As List(Of String) = (From item In IO.Directory.GetFiles("\MyServerg$MyFolder") _
Let file = New IO.FileInfo(item) _
Order By file.LastWriteTime _
Select item).ToList()

您可以尝试使用DirectoryInfo.EnumerateFiles,它有两个优点:

  1. 不需要从远程服务器进行连续的安全握手
  2. 对文件进行流式处理,而不是在开始排序之前将其全部加载到内存中

Dim di = new DirectoryInfo(strFolderSource)
Dim files = From fi In di.EnumerateFiles() Order By fi.LastWriteTime Select fi.FullName
Dim myOrderedList As List(Of String) = files.ToList()

最终解决,包括在网络使用之后和GetFiles()之前睡眠5秒:

System.Threading.Thread.Sleep(5000)

感谢您抽出时间,并希望这能帮助任何有类似问题的人。

最新更新