- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我正在尝试通过 C# 中的 FtpWebRequest 类实现 ftp/sftp,但直到现在都没有成功。
我不想使用任何第 3 方免费或付费 dll。
凭证就像
我能够通过 Ip 地址实现 ftp,但无法通过凭据为上述主机名实现 sftp。
对于 sftp,我已将 FtpWebRequest 类的 EnableSsl 属性启用为 true,但出现无法连接到远程服务器的错误。
我可以使用相同的凭据和主机名连接 Filezilla,但不能通过代码连接。
我观察到 filezilla,它将主机名从 sftp.xyz.com 更改为 sftp://sftp.xyz.com在文本框和命令行中,它将用户标识更改为 abc@sftp.xyz.com
我在代码中做了同样的事情,但对 sftp 没有成功。
请就此寻求紧急帮助。提前致谢。
下面是我目前的代码:
private static void ProcessSFTPFile()
{
try
{
string[] fileList = null;
StringBuilder result = new StringBuilder();
string uri = "ftp://sftp.xyz.com";
FtpWebRequest ftpRequest = (FtpWebRequest)WebRequest.Create(new Uri(uri));
ftpRequest.Method = WebRequestMethods.Ftp.ListDirectoryDetails;
ftpRequest.EnableSsl = true;
ftpRequest.Credentials = new NetworkCredential("abc@sftp.xyz.com", "123");
ftpRequest.UsePassive = true;
ftpRequest.Timeout = System.Threading.Timeout.Infinite;
//ftpRequest.AuthenticationLevel = Security.AuthenticationLevel.MutualAuthRequested;
//ftpRequest.Proxy = null;
ftpRequest.KeepAlive = true;
ftpRequest.UseBinary = true;
//Hook a callback to verify the remote certificate
ServicePointManager.ServerCertificateValidationCallback = new RemoteCertificateValidationCallback(ValidateServerCertificate);
//ServicePointManager.ServerCertificateValidationCallback = ((sender, certificate, chain, sslPolicyErrors) => true);
FtpWebResponse response = (FtpWebResponse)ftpRequest.GetResponse();
StreamReader reader = new StreamReader(response.GetResponseStream());
string line = reader.ReadLine();
while (line != null)
{
result.Append("ftp://sftp.xyz.com" + line);
result.Append("\n");
line = reader.ReadLine();
}
if (result.Length != 0)
{
// to remove the trailing '\n'
result.Remove(result.ToString().LastIndexOf('\n'), 1);
// extracting the array of all ftp file paths
fileList = result.ToString().Split('\n');
}
}
catch (Exception ex)
{
Console.WriteLine(ex.Message.ToString());
Console.ReadLine();
}
}
public static bool ValidateServerCertificate(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors)
{
if (certificate.Subject.Contains("CN=sftp.xyz.com"))
{
return true;
}
else
{
return false;
}
}
最佳答案
如果使用 BizTalk, you can work with the SFTP Adapter , 使用 ESB Toolkit .它自 2010 年以来一直受到支持。有人想知道为什么它没有进入 .Net Framework
--
不幸的是,目前仅使用框架仍需要大量工作。放置 sftp
协议(protocol)前缀不足以使其工作
现在仍然没有内置的 .Net Framework 支持,也许在未来。
-------------------------------------------- --------------
1) 一个值得尝试的好库是 SSHNet .
-------------------------------------------- --------------
它有:
文档中的示例代码:
列出目录
/// <summary>
/// This sample will list the contents of the current directory.
/// </summary>
public void ListDirectory()
{
string host = "";
string username = "";
string password = "";
string remoteDirectory = "."; // . always refers to the current directory.
using (var sftp = new SftpClient(host, username, password))
{
sftp.Connect();
var files = sftp.ListDirectory(remoteDirectory);
foreach (var file in files)
{
Console.WriteLine(file.FullName);
}
}
}
上传文件
/// <summary>
/// This sample will upload a file on your local machine to the remote system.
/// </summary>
public void UploadFile()
{
string host = "";
string username = "";
string password = "";
string localFileName = "";
string remoteFileName = System.IO.Path.GetFileName(localFile);
using (var sftp = new SftpClient(host, username, password))
{
sftp.Connect();
using (var file = File.OpenRead(localFileName))
{
sftp.UploadFile(remoteFileName, file);
}
sftp.Disconnect();
}
}
下载文件
/// <summary>
/// This sample will download a file on the remote system to your local machine.
/// </summary>
public void DownloadFile()
{
string host = "";
string username = "";
string password = "";
string localFileName = System.IO.Path.GetFileName(localFile);
string remoteFileName = "";
using (var sftp = new SftpClient(host, username, password))
{
sftp.Connect();
using (var file = File.OpenWrite(localFileName))
{
sftp.DownloadFile(remoteFileName, file);
}
sftp.Disconnect();
}
}
-------------------------------------------- --------------
2) 另一个替代库是 WinSCP
-------------------------------------------- --------------
以下面的例子:
using System;
using WinSCP;
class Example
{
public static int Main()
{
try
{
// Setup session options
SessionOptions sessionOptions = new SessionOptions
{
Protocol = Protocol.Sftp,
HostName = "example.com",
UserName = "user",
Password = "mypassword",
SshHostKeyFingerprint = "ssh-rsa 2048 xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx"
};
using (Session session = new Session())
{
// Connect
session.Open(sessionOptions);
// Upload files
TransferOptions transferOptions = new TransferOptions();
transferOptions.TransferMode = TransferMode.Binary;
TransferOperationResult transferResult;
transferResult = session.PutFiles(@"d:\toupload\*", "/home/user/", false, transferOptions);
// Throw on any error
transferResult.Check();
// Print results
foreach (TransferEventArgs transfer in transferResult.Transfers)
{
Console.WriteLine("Upload of {0} succeeded", transfer.FileName);
}
}
return 0;
}
catch (Exception e)
{
Console.WriteLine("Error: {0}", e);
return 1;
}
}
}
关于c# - 如果可能,在 C# 中使用 FtpWebRequest 在没有第 3 方 dll 的情况下实现 FTP/SFTP,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10657377/
我正在寻找一小段示例代码,该示例代码使用System.Net.FtpWebRequest命名空间来获取ftp服务器上指定的远程文件的时间戳。我知道我需要将请求对象的Method属性设置为WebRequ
我在这里使用示例: http://msdn.microsoft.com/en-us/library/ms229715.aspx将 1GB 的大文件上传到 FTP 服务器。然而它就在线窒息: byte[
我制作了一个批处理类来检查 FTP 上的文件、下载它们并在 FTP 上删除它们。 当我手动运行它(不是批量运行)时,它运行完美,下载 FTP 中的所有文件并在下载完成后删除它们。 当我尝试批量运行时,
我在使用 C# 中的 FtpWebRequest 类时遇到了问题。 当我第一次尝试使用正确的凭据将文件上传到 FTP 服务器,然后第二次使用错误的凭据(用户名相同但密码错误)时,没有抛出异常并且文件仍
我想连接到工作在“主动模式”下的 FTP 服务器。这意味着,客户端可以发送应该在其上进行数据连接的端口号。通常这是一个随机端口。 (N > 1023) 在我们的例子中,如果我们总是可以使用特定端口连接
我正在使用以下代码从远程 ftp 服务器下载文件: FtpWebRequest request = (FtpWebRequest)WebRequest.Create(serverPat
我正在为 .NET 创建一个通用的 FTP 类。我似乎让事情运作良好,但有一些细节我有点不确定。 MSDN 上的文档完全没有提供有关这些细节的信息。 例如,在执行WebRequestMethods.F
正在尝试将文件上传到 FTP。登录时我设置在目录/out,上传前需要返回一个目录然后上到目录/in。我有这段代码: FtpWebRequest req = (FtpWebRequest)
我想序列化 FtpWebRequest 类的一个实例。是否可以?当我尝试时,它给了我错误,类未标记为可序列化,这意味着我无法序列化该对象,但在 msdn 文档中,他们提到了 ISerializable
我正在开发一个将多个文件上传到 FTP 的程序。为此我需要完成 8 个 Action : 在 FTP 中创建一个新文件夹 上传三个文件到新目录 在新目录下创建三个子目录 根据我收集到的信息,我只能处理
我正在组装一个简单的应用程序,我让它使用 FtpWebRequest 上传、下载、删除文件。但是我找不到如何使用 FtpWebRequest 移动文件。在不使用另一个外部依赖项的情况下将文件从一个目录
我正在尝试创建一个简单的方法,使用 FtpWebRequest 和方法 WebRequestMethods.Ftp.DownloadFile 从 FTP 下载文件。问题是我不想显示下载进度,因此需要提
以下代码旨在通过 FTP 检索文件。但是,我遇到了错误。 serverPath = "ftp://x.x.x.x/tmp/myfile.txt"; FtpWebRequest request = (F
我有以下代码来通过 FTP 检索文件: try { FtpWebRequest request = (FtpWebRequest)WebRequ
我最近使用 C# 将 Windows cmd 转换为 FtpWebRequest,以将文件上传到 IBM 大型机数据集。 Look here。 运行两者时,我发现它们上传到不同的数据集,而它们应该完全
使用FtpWebRequest列出目录的内容;但是,它没有显示隐藏文件。 如何让它显示隐藏文件? FtpWebRequest request = (FtpWebRequest)WebRequest.C
我需要列出 FTP 服务器上的数千个文件,并删除必要的文件。正如您所猜测的,性能至关重要,因此我需要一种重用 FTP 连接的方法。 MSDN上没有足够的关于FtpWebRequests连接使用的解释!
我正在尝试从包含大约 9000 个文件的 FTP 位置检索文件列表。 但是下面的代码总是只给出97个文件。在第 98 个文件的循环开始时,StreamReader.Peek() 变为 -1 输出“te
我一直致力于为客户构建一项功能,使他们能够从 www.site1.com 上传图像,将图像 URL 存储到数据库并将图像存储到 www.site2.com/images 上的文件中.我已经设法将文件上
我在使用 .NET FTPWebRequest 类将文件上传到 vsftpd 服务器时遇到了一些问题。 首先,有没有办法使用 ListDirectoryDetails 请求列出隐藏文件?现在我没有
我是一名优秀的程序员,十分优秀!