C# ftp上传到Linux

2024-03-07

我正在尝试检查 FTP 服务器上是否存在目录。在您说“使用 ListDirectory”或“使用 PrintWorkingDirectory”之前,它们并不总是有效;例如,我测试了是否ftp://网络服务器/日志 ftp://webserver/Logs存在,并且都告诉我它存在,但实际上并不存在。因此,我已经将文件上传到目录,如果成功,则该目录存在。

问题是,以下方法不适用于运行 vsFTPd 2.0.7.2 的 GoDaddy 基于 CentOS 的服务器。与 IIS7.5 上的 Microsoft FTP 服务器配合良好。

因此,我使用 Wireshark 监控流量,并使用 Filezilla 来查看它正在做什么,而我的应用程序无法使其正常工作。唯一的区别是 Filezilla 正在更改工作目录,因为我试图上传带有路径的文件。

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

App code

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 获取 Home 路径

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();
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C# ftp上传到Linux 的相关文章

随机推荐

  • 将枚举值绑定到标签 XAML

    我正在使用枚举字段来跟踪程序的状态 public enum StatiMacchina InAvvio 1 Pronta 2 InLavorazione 3 InMovimento 4 InAttesa 5 InErrore 6 我想绑定跟
  • 中心引导行和跨度

    我正在尝试使用引导程序将行及其内部的跨度居中 您可以在页脚中看到它 http www divisionforty com wall http www divisionforty com wall 我希望社交网络图标位于左侧 版权位于中间 由
  • MVC 6 OpenIdConnect

    目前 我在将 MVC 应用程序从 beta 3 迁移到 4 时遇到了多个问题 其中之一与 OpenIdConnect 到 Windows Azure 进行身份验证有关 当我转到具有授权属性的页面时 该页面会停止处理并位于空白页面 而不会显示
  • 我无法以编程方式检测 angularjs 中的值变化

    我是 angularjs 的新手 我遇到了麻烦 I have html像这样 section class content div div section
  • DTO 道 POCO BO

    事实上 我对这些术语以及它们之间的关系感到非常困惑 我读过有关其中每个人的一些内容 但我不了解工作流程 DTO 数据传输对象 传输值的对象BO 业务对象 域模型中的对象 用于制作业务逻辑的对象POCO 不知道 我在维基上读过定义 但什么也没
  • Vue-i18n - 无法读取未定义的属性“配置”

    首先 我向您展示什么是有效的 在 App js 中 import router from routes js import VueI18n from vue i18n const messages en message hello hell
  • PHP静态成员不保值

    大家好 我正在编写的 WordPress 插件遇到了一个奇怪的问题 但这与 WordPress 本身无关 更多地与 PHP 有关 所以请继续阅读 以便我可以解释 WordPress 插件已连接 以便调用 init 函数 这有效 我可以确认它
  • iOS 模拟器中屏幕内容仅显示在部分屏幕上

    我的 iOS 模拟器仅将内容显示为屏幕的一部分 我该如何修复它 我正在使用 XCode 6 3 1 谢谢 你只需要重新启动它 有时会发生这种情况 强制关闭模拟器并重新启动
  • Django 中的syncdb 时内容类型过时

    当我努力的时候syncdb对于我的 django 项目 我看到以下抱怨 The following content types are stale and need to be deleted myapp Any objects relat
  • 在Java中调用Python?

    我想知道是否可以使用 Jython 从 Java 代码调用 Python 函数 还是只能从 Python 调用 Java 代码 Jython 用于 Java 平台的 Python http www jython org index html
  • Docker 注册表镜像未使用

    当我尝试从本地镜像中提取图像时 它起作用了 docker login u docker p mypassword nexus3 pleiade mycomp fr 5000 docker pull nexus3 pleiade mycomp
  • 数字签名服务器上的私钥存储在哪里?

    我正在开发一个客户端服务器应用程序 需要在发送到客户端之前使用私钥对某些文件进行签名 然后 客户端将使用公钥验证签名 因此 私钥需要始终位于服务器上并且可由服务器应用程序读取 问题是我想知道在哪里存储我的私钥 这样在服务器受到威胁时更安全
  • 为什么 sizeWithFont:constrainedToSize:lineBreakMode: 返回错误的大小?

    我想要在表格单元格的标签中显示的字符串有两种可能的宽度 并且我需要计算高度 以便正确记录表格单元格的高度 然而 无论我对约束尺寸做什么 我都会得到相同的高度 这在我想要的情况下是不正确的 我正在使用的代码 CGFloat width 300
  • 如何使用prepareForReuse方法

    我发现这个方法叫做 void prepareForReuse I 阅读文档 https developer apple com documentation uikit uitableviewcell但我不明白如何使用它 当我滚动表格视图时
  • 如何使用 C# 创建包装 RTD 函数的 Excel 自动化插件?

    我有一个基于 RtdServer 的可用自动化插件 如何使用 RtdServer 在 C 中创建实时 Excel 自动化插件 https stackoverflow com questions 5397607 howto create a
  • Scikit learn 错误消息“精度和 F 分数定义不明确,在标签中设置为 0.0”[重复]

    这个问题在这里已经有答案了 我正在研究二元分类模型 分类器是朴素贝叶斯 我有一个几乎平衡的数据集 但是当我预测时 我收到以下错误消息 UndefinedMetricWarning Precision and F score are ill
  • 睡眠的意义(0)

    我以前见过Sleep 0 在我的代码的某些部分 一些无限 长while循环可用 我被告知这将使时间片可用于其他等待进程 这是真的 有没有什么意义Sleep 0 根据 MSDN 的文档Sleep http msdn microsoft com
  • Rails.logger.info 在初始化程序中不起作用

    Rails logger info在初始化程序中使用时不会写入任何信息到日志中 如何登录初始化程序 Rails logger Logger new STDOUT before MyServer Application initialize
  • 有关 ajax 回调和 drupal_process_form 的帮助

    我有一个通过仅在视图模式下显示的 nodeapi 添加的表单 用户可以从选择菜单中选择一个项目 他们的选择将通过发生更改时的 hook menu 回调自动保存到数据库中 如果用户禁用了 javascript 它将使用表单 api 正常提交
  • C# ftp上传到Linux

    我正在尝试检查 FTP 服务器上是否存在目录 在您说 使用 ListDirectory 或 使用 PrintWorkingDirectory 之前 它们并不总是有效 例如 我测试了是否ftp 网络服务器 日志 ftp webserver L