首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >c# ftp上传到Linux

问c# ftp上传到Linux
EN

Stack Overflow用户
提问于 2011-11-02 21:58:21
回答 1查看 5.7K关注 0票数 3

我试图检查FTP服务器上是否存在一个目录。在你说“使用ListDirectory”或“使用PrintWorkingDirectory”之前,它们并不总是有效的;例如,我测试了ftp://webserver/Logs是否存在,并且都告诉我它确实不存在。因此,我沿着上传文件到目录的路线前进,如果成功,目录就会存在。

问题是,下面的方法不适用于GoDaddy的基于CentOS的服务器运行vsFTPd 2.0.7.2。适用于IIS7.5上的Microsoft服务器。

因此,我用Wireshark监控流量,并使用Filezilla来查看它在做什么,而我的应用程序并不能让它工作。唯一的区别是Filezilla改变了工作目录,当我试图上传文件时,文件前面有一个路径。

我有一种感觉,这与它上传到服务器的路径和Linux的解释有关,因为名字可能有点好笑……-D有什么想法受到热烈欢迎?

应用程序代码

代码语言:javascript
复制
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日志

代码语言:javascript
复制
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的应用程序日志

代码语言:javascript
复制
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.

如果文件夹不存在,则创建文件夹。

代码语言:javascript
复制
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.
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-11-02 23:51:06

Linux又咬人了..。

解决方案是在路径名中设置一个双斜杠,以便当涉及到STOR时,它有一个前导斜杠.就像这样:

代码语言:javascript
复制
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

代码语言:javascript
复制
req = (FtpWebRequest)WebRequest.Create("ftp://website//Home/test1/directoryexists.test"); 

这样STOR命令看起来就像

代码语言:javascript
复制
STOR /Home/test1/directoryexists.test

您可以从StatusDescription获得主页路径

代码语言:javascript
复制
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();
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7987829

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档