服务器上存在文件,但列表目录命令未返回
Files exist on server but are not returned by list directory command
我正在使用 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 或批处理,但并不理想。
看起来 FluentFTP 可以通过将列表选项设置为 FtpListOption.AllFiles
来处理这个问题。
我使用了以下代码并成功列出了文件:
FtpListItem[] files = ftp.GetListing(path, FtpListOption.AllFiles)
.Where(x => x.Type == FtpFileSystemObjectType.File)
.OrderBy(x => x.Modified)
.ToArray();
这个库也支持下载。
更新:根据已接受的答案,WinSCP 可以通过将 ftpListAll
设置为 0..
来正确处理此问题
使用 WinSCP .NET 程序集,您必须将 FtpListAll
option 设置为 0
(=on):
opts.AddRawSettings("FtpListAll", "0");
或者您可以使用 WinsCP GUI generate the code template。
与 FtpWebRequest
一起,将 -a
添加到 URL。
见。
我正在使用 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 或批处理,但并不理想。
看起来 FluentFTP 可以通过将列表选项设置为 FtpListOption.AllFiles
来处理这个问题。
我使用了以下代码并成功列出了文件:
FtpListItem[] files = ftp.GetListing(path, FtpListOption.AllFiles)
.Where(x => x.Type == FtpFileSystemObjectType.File)
.OrderBy(x => x.Modified)
.ToArray();
这个库也支持下载。
更新:根据已接受的答案,WinSCP 可以通过将 ftpListAll
设置为 0..
使用 WinSCP .NET 程序集,您必须将 FtpListAll
option 设置为 0
(=on):
opts.AddRawSettings("FtpListAll", "0");
或者您可以使用 WinsCP GUI generate the code template。
与 FtpWebRequest
一起,将 -a
添加到 URL。
见