我正在使用WinSCP .NET NuGet包来访问我无法控制的第三方FTP服务器。
问题:似乎在初始LIST
命令(列出了所有文件)之后,服务器不再列出目录中存在的文件 - 仅副主任。但是,如果我在FireFox或FileZilla中打开相同的FTP目录,则会显示文件。相比之下,WinSCP工具本身不会列出文件。
似乎WinSCP遵守服务器的指令,不列出这些文件。内置的.NET FTP库(FtpWebRequest
)具有完全相同的限制。
我用来访问服务器的代码如下:
public class FTP
{
private SessionOptions opts = new SessionOptions();
public FTP(string _userName, string _password, string _server)
{
opts.UserName = _userName;
opts.Password= _password;
opts.HostName = _server;
opts.Protocol = Protocol.Ftp;
opts.FtpMode = FtpMode.Passive;
}
public string[] GetFiles(string directory)
{
try
{
using (Session session = new Session())
{
session.Open(opts);
RemoteDirectoryInfo dir = session.ListDirectory(directory);
return dir.Files.Where(x => !x.IsDirectory).Select(x => x.Name).ToArray();
}
}
catch (Exception)
{
throw;
}
}
}
WinSCP(或另一个C#库)中是否有可以正确处理这种情况的解决方法?
外部流程(如PowerShell或批处理)是可以接受的,但并不理想。
答案 0 :(得分:2)
看起来FluentFTP能够通过将列表选项设置为FtpListOption.AllFiles
来处理此问题。
我使用了以下代码并成功列出了文件:
FtpListItem[] files = ftp.GetListing(path, FtpListOption.AllFiles)
.Where(x => x.Type == FtpFileSystemObjectType.File)
.OrderBy(x => x.Modified)
.ToArray();
该库也支持下载。
更新:根据接受的答案,WinSCP可以正确处理此问题,ftpListAll
设置为0 ..
答案 1 :(得分:2)
使用WinSCP .NET程序集,您必须将FtpListAll
选项设置为0
(= on):
opts.AddRawSettings("FtpListAll", "0");
请参阅https://winscp.net/eng/docs/rawsettings
使用FtpWebRequest
,将-a
添加到网址。
请参阅FtpWebRequest ListDirectory does not return hidden files。