所以我有一个运行在Windows服务器上的vb.net应用程序,它有一个ftp类,我们调用它来与我们的unix服务器上的文件进行交互。该应用程序运行良好多年,直到我们开始与大型组(约130个PDF文件)进行交互。当我们试图删除它们时,突然文件名会被切断。
我们在尝试删除文件时遇到的错误" a839084_gaa13-132_tower-j34-aspect-localization-specification-jd345.pdf"
" 550 a839084_gaa13-132_tower-j34-aspect-locali:路径名中的文件或目录不存在。"
下面是我们如何调用它的示例,该函数列在它下面。有关如何改进此代码的任何想法,以便它不再发生?我认为当我们尝试Split()文本时会出现问题。另一个奇怪的是,这个错误并不总是可以重现的。当我在开发服务器上放置相同的文件集时,我没有收到错误。
...
' Read the Remote list into an array
Dim RemList() As String = ftpConnObj.GetFileList("*.pdf")
Dim i As Object
'loop through each file in the array and delete the Remote file.
For Each i In RemList
If i.ToString.Trim.Length > 0 Then
Try
ftpConnObj.DeleteFile(i.ToString.Trim)
connMsg = ftpConnObj.MessageString
...
' Return a list of files within a string() array from the
' file system.
Public Function GetFileList(ByVal sMask As String) As String()
Dim cSocket As Socket
Dim bytes As Int32
Dim seperator As Char = ControlChars.Lf
Dim mess() As String
m_sMes = ""
If (Not (m_bLoggedIn)) Then
Login()
End If
cSocket = CreateDataSocket()
SendCommand("NLST " & sMask)
If (Not (m_iRetValue = 150 Or m_iRetValue = 125)) Then
MessageString = m_sReply
Throw New IOException(m_sReply.Substring(4))
End If
m_sMes = ""
Do While (True)
Array.Clear(m_aBuffer, 0, m_aBuffer.Length)
bytes = cSocket.Receive(m_aBuffer, m_aBuffer.Length, 0)
m_sMes += ASCII.GetString(m_aBuffer, 0, bytes)
If (bytes < m_aBuffer.Length) Then
Exit Do
End If
Loop
mess = m_sMes.Split(seperator)
cSocket.Close()
ReadReply()
If (m_iRetValue <> 226) Then
MessageString = m_sReply
Throw New IOException(m_sReply.Substring(4))
End If
Return mess
End Function
答案 0 :(得分:0)
您似乎遇到了Windows强加的260-character path length limit(并且不会影响您的Unix服务器)。
我提到这一点是因为您特别注意到错误在开发环境中是不可重现的(开发环境中通常是本地的,因此不太可能深深嵌套在目录结构中)
您可能需要重命名Unix服务器上的文件,以便在Windows中使用完整路径少于260个字符,然后才能使用此代码对它们执行任何操作。