首页 > 编程语言 >c#使用FluentFTP来做FTP的上传下载

c#使用FluentFTP来做FTP的上传下载

时间:2024-10-29 21:58:02浏览次数:6  
标签:FTP wc string c# Uri FluentFTP var new realTargetFile

最近由于项目需要,做了个FTP的上传下载

上传

/// <summary>
/// 上传共享文件
/// </summary>
/// <param name="server">服务器信息</param>
/// <param name="files">文件列表</param>
public static void UploadFtpFiles(FileServerConfig server, List<TransferFile> files)
{
    Exception ex = null;
    var ftpHost = new Uri(server.UploadServer).Host;
    var ftpPort = new Uri(server.UploadServer).Port == -1 ? 21 : new Uri(server.UploadServer).Port; // 默认FTP端口是21
    var wc = new FtpClient(ftpHost, server.FtpUser, server.FtpPassword, ftpPort);
    wc.Config.DataConnectionType= FtpDataConnectionType.AutoPassive;
    wc.Connect();
    if (files.Count == 0)
    {
        throw new Exception("没有上传文件!");
    }
    
    foreach (var file in files)
    {
        //warn: 不要修改TransferFile对象
        var realTargetFile = server.UploadServer + file.TargetFile;
        if (!Directory.Exists(Path.GetDirectoryName(realTargetFile)))
            Directory.CreateDirectory(Path.GetDirectoryName(realTargetFile));

        //File.Exists无法判断ftp文件是否存在,可以判断share文件是否存在
        if (File.Exists(realTargetFile))
        {
            var backupFile = Path.Combine(Path.GetDirectoryName(realTargetFile), Path.GetFileNameWithoutExtension(realTargetFile) + "_" + CommonHelper.GetDateTimeNowString() + ".bak");
            File.Move(realTargetFile, backupFile);
        }
        Uri uri = new Uri(realTargetFile);
        int count = 3;
        #region 上传出错,执行三次
        while (true)
        {
            var remote = uri.AbsolutePath.Replace("/Attachment", "").Replace("//", "/");
            if (UploadSharedFile(wc, file.SourceFile, remote, count, ref ex))
            {
                wc.Disconnect();
                break;
            }
            count--;
            if (count == 0)
            {
                break;
            }
            Thread.Sleep(1000);
            wc.Dispose();
            wc = new FtpClient();
        }
        #endregion
        if (ex != null)
        {
            break;
        }
    }
    wc.Dispose();
    if (ex != null)
    {
        throw ex;
    }
}
private static bool UploadSharedFile(FtpClient wc, string localFilePath, string remoteFilePath, int count, ref Exception ex)
{
    try
    {
        wc.UploadFile(localFilePath, remoteFilePath, FtpRemoteExists.Overwrite, true);
    }
    catch (Exception e)
    {
        if (count == 1)
        {
            ex = e;
        }
        return false;
    }
    return true;
}

 

 

下载

/// <summary>
/// 下载共享文件
/// </summary>
/// <param name="filePath">下载地址</param>
/// <param name="destinationPath">目标地址</param>
/// <param name="ftpUser">ftp用户名</param>
/// <param name="ftpPassword">ftp密码</param>
public static void DownloadFile(string filePath, string destinationPath, string ftpUser, string ftpPassword)
{
    var fileName = Path.GetFileName(filePath);
    // FTP服务器的地址和端口
    string ftpServerHost = new Uri(filePath).Host;
    int ftpPort = new Uri(filePath).Port == -1 ? 21 : new Uri(filePath).Port; // 默认FTP端口是21
    // 创建FtpClient实例
    using (var client = new FtpClient(ftpServerHost, ftpUser, ftpPassword, ftpPort))
    {
        // Ftp被动模式                                                                
        client.Config.DataConnectionType = FtpDataConnectionType.AutoPassive;
        // 连接到FTP服务器
        client.Connect();
        var localFile = Path.Combine(destinationPath, fileName);
        Uri uri = new Uri(filePath);
        // 下载文件
        client.DownloadFile(localFile, uri.AbsolutePath);
        // 断开连接
        client.Disconnect();
    }
}

 

标签:FTP,wc,string,c#,Uri,FluentFTP,var,new,realTargetFile
From: https://www.cnblogs.com/siyunianhua/p/18514603

相关文章

  • 2024.10.19 CF2030(Div.2)
    比赛链接Solved:5/8Upsolved:6/8Rank:166E.MEXmizetheScore题意定义一个集合的分数为:将它分成若干个子集,mex和的最大值。(mex从0开始算)给n个数,求所有非空子集的分数之和。\(n\leq2\times10^5\)题解对一个确定的集合,它的划分方式一定是每次分出去一个最长的{0,......
  • 实验3 C语言函数应用编程
    #include<stdio.h>charscore_to_grade(intscore);intmain(){intscore;chargrade;while(scanf("%d",&score)!=EOF){grade=score_to_grade(score);printf("分数:%d,等级:%c\n\n",score,gr......
  • Spring Boot 和 Spring Cloud 的区别
    在Java开发领域,SpringBoot和SpringCloud都是非常流行的框架,它们为开发者提供了便捷的开发方式和强大的功能。但很多人对这两个框架的区别并不十分清楚。本文将详细介绍SpringBoot和SpringCloud的区别。一、SpringBoot简介SpringBoot是一个用于快速构建独立的、......
  • 2024.10.14 Codeforces Round 978 (Div. 2)
    比赛链接Solved:4/7Upsolved:5/7Rank:447(rated343)D2.Asesino(HardVersion)题意:有n个人,除了一个卧底以外,其他人或者只会说真话,或者只会说谎,且他们知道彼此的身份。卧底只会说谎,但其他人都认为他只会说真话。现在你可以进行若干次询问,每次询问形如问第i个人第j个人是什么......
  • springmvc-servlet.xml和web.xml文件的存放路径是哪里?项目添加到Tomcat上运行后就报错
        用eclipse写了一个简单的web项目,springmvc-servlet.xml文件和web.xml文件都配置好了,运行起来能看见hello的web页面,但是有一堆报错,不知道是什么原因                                     ......
  • javascript-Web APLs (三)
     事件流指的是事件完整执行过程中的流动路径 说明:假设页面里有个div,当触发事件时,会经历两个阶段,分别是捕获阶段、冒泡阶段 简单来说:捕获阶段是从父到子冒泡阶段是从子到父 实际工作都是使用事件冒泡为主事件捕获DOM.addEventListener(事件类型,事件处......
  • 从零开始的JavaScript基础!
    目录一、JavaScript的概述二、如何在HTML页面中使用JS(一)、行内式 (二)、内嵌式(三)、外链式(四)、基本执行顺序1.从上到下线性执行:2.阻塞行为:(五)、JS输出方式1. alert() 通过浏览器弹出框进行输出 2.document.write() 直接在网页页面中进行输出 3.console.log()......
  • 2024.10.24 The 2021 ICPC Northwestern Russia Regional Contest
    比赛链接Solved:8/14Penalty:909Rank:23前五道签到题ABCHL。K.KaleidoscopicRoute题意给一张带边权的图,求一条1到n的路径,使经过的边数最少的同时边的极差最大。题解求出最短路图,然后DAG上dp:f和g分别表示从1到这个点能经过的最大边权和最小边权。然后每转移一条边(x,y,z......
  • CSS常见适配布局方式
    在网页设计中,布局是确保内容按预期显示的关键部分。CSS提供了多种布局方式,每种方式都有其特定的用途和优势。以下是您提到的五种布局方式的详细解释:1.流式布局(百分比布局)概述:流式布局,也称为百分比布局,使用百分比来定义元素的宽度和高度,而不是固定的像素值。这种方式使页面......
  • 0x02 Leetcode Hot100 哈希
    前置知识掌握每种语言的基本数据类型及其时间复杂度。Python:list、tuple、set、dictC++:STL中的vector、set、mapJava:集合类中的List、Set、Map为什么是哈希?在不同语言中,对于字典(dict)类的数据都会先将其键(key)进行哈希(Hash)运算,这个Hash值决定了键值对在内存中的存储位置,因此......