c#linux ftp服务器,C#FTP上传到Linux

我正在尝试检查FTP服务器上是否存在目录.在您说“使用ListDirectory”或“使用PrintWorkingDirectory”之前,它们并不总是有效.例如,我测试了ftp://webserver/Logs是否存在,并且都告诉我它确实不存在.因此,我放弃了将文件上传到目录的路线,如果成功,则该目录存在.

问题是,以下方法不适用于GoDaddy基于CentOS的服务器运行vsFTPd 2.0.7.2.可以在IIS7.5上与Microsoft FTP服务器正常工作.

因此,我使用Wireshark监控了流量,并使用Filezilla来查看我的App并未使其正常运行.唯一的区别是Filezilla更改了工作目录,而我正尝试在其中上载文件的路径之前上传该文件.

我感觉这与其上载到服务器的路径以及Linux的解释有关,因为它的名称可能有点可笑… :-D有热情欢迎的想法吗?

应用程式码

private bool DirectoryExists(string d)

{

bool exists = true;

try

{

string file = "directoryexists.test";

string path = url + homepath + d + "/" + file;

//Try to save to the directory

req = (FtpWebRequest)WebRequest.Create(path);

req.ConnectionGroupName = "conngroup1";

req.Method = WebRequestMethods.Ftp.UploadFile;

if (nc != null) req.Credentials = nc;

if (cbSSL.Checked) req.EnableSsl = true;

req.Timeout = 10000;

byte[] fileContents = System.Text.Encoding.Unicode.GetBytes("SAFE TO DELETE");

req.ContentLength = fileContents.Length;

Stream s = req.GetRequestStream();

s.Write(fileContents, 0, fileContents.Length);

s.Close();

//Delete file if successful

req = (FtpWebRequest)WebRequest.Create(path);

req.ConnectionGroupName = "conngroup1";

req.Method = WebRequestMethods.Ftp.DeleteFile;

if (nc != null) req.Credentials = nc;

if (cbSSL.Checked) req.EnableSsl = true;

req.Timeout = 10000;

res = (FtpWebResponse)req.GetResponse();

res.Close();

}

catch (WebException ex)

{

exists = false;

}

return exists;

}

通过Wireshark的Filezilla日志

Response: 230 Login successful.

Request: CWD /Home/test1

Response: 250 Directory successfully changed.

Request: TYPE I

Response: 200 Switching to Binary mode.

Request: PASV

Response: 227 Entering Passive Mode (216,69,186,142,71,209)

Request: LIST

Response: 150 Here comes the directory listing.

FTP Data: 78 bytes

Response: 226 Directory send OK.

Request: PASV

Response: 227 Entering Passive Mode (216,69,186,142,177,1)

Request: STOR directoryexists.txt

Response: 150 Ok to send data.

Response: 226 File receive OK.

通过Wireshark的应用程序日志

Response: 230 Login successful.

Request: OPTS utf8 on

Response: 501 Option not understood.

Request: PWD

Response: 257 "/Home/"

Request: PWD

Response: 257 "/Home/"

Request: TYPE I

Response: 200 Switching to Binary mode.

Request: PASV

Response: 227 Entering Passive Mode (216,69,186,142,217,87)

Request: STOR test1/directoryexists.txt

Response: 553 Could not create file.

如果文件夹不存在,它将创建文件夹.

Response: 230 Login successful.

Request: PWD

Response: 257 "/Home/"

Request: PWD

Response: 257 "/Home/"

Request: TYPE I

Response: 200 Switching to Binary mode.

Request: PASV

Response: 227 Entering Passive Mode (216,69,186,142,220,60)

Request: STOR Logs/directoryexists.txt

Response: 553 Could not create file.

Request: PWD

Response: 257 "/Home/"

Request: MKD Logs

Response: 257 Create folder operation successful.

Request: TYPE I

Response: 200 Switching to Binary mode.

Request: PASV

Response: 227 Entering Passive Mode (216,69,186,142,255,245)

Request: STOR Logs/LogFiles/directoryexists.txt

Response: 553 Could not create file.

Request: PWD

Response: 257 "/Home/"

Request: MKD Logs/LogFiles

Response: 257 Create folder operation successful.

解决方法:

Linux再次咬人…

解决方案是在路径名中设置一个双斜杠,以便在STOR时使用一个斜杠…就像这样:

string url = "ftp://website/";

string homepath = "/Home/";

string d = "test1";

string file = "directoryexists.test";

string path = url + homepath + d + "/" + file;

因此完整路径应类似于ftp://website//Home/test1/directoryexists.test

req = (FtpWebRequest)WebRequest.Create("ftp://website//Home/test1/directoryexists.test");

这样,STOR命令将看起来像

STOR /Home/test1/directoryexists.test

您可以从StatusDescription获取主路径

req = (FtpWebRequest)WebRequest.Create(url);

req.Method = WebRequestMethods.Ftp.PrintWorkingDirectory;

if (nc != null) req.Credentials = nc;

if (cbSSL.Checked) req.EnableSsl = true;

req.Timeout = 10000;

res = (FtpWebResponse)req.GetResponse();

System.Text.RegularExpressions.Regex regexp = new System.Text.RegularExpressions.Regex("\\s\"([^\"]*)\"\\s");

homepath = regexp.Match(res.StatusDescription).Groups[1].Value;

res.Close();

标签:ftpwebrequest,c

来源: https://codeday.me/bug/20191202/2086215.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值