使用C#操作ftp服務(wù)器的示例代碼
基礎(chǔ)類的構(gòu)造函數(shù)和屬性
public abstract class FtpOperation
{
/// <summary>
/// FTP服務(wù)器地址
/// </summary>
private string ftpServer;
/// <summary>
/// 用戶名
/// </summary>
private string userName;
/// <summary>
/// 密碼
/// </summary>
private string passWord;
/// <summary>
/// FTPHelper類的構(gòu)造函數(shù)
/// </summary>
/// <param name="ftpServer">FTP服務(wù)器地址</param>
/// <param name="userName">用戶名</param>
/// <param name="passWord">密碼</param>
public FtpOperation(string ftpServer, string userName, string passWord)
{
this.ftpServer = ftpServer;
this.userName = userName;
this.passWord = passWord;
}
/// <summary>
/// 執(zhí)行FTP操作的方法
/// </summary>
/// <param name="action">要執(zhí)行的操作</param>
private void ExecuteFtpOperation(Action action)
{
try
{
action.Invoke();
}
catch (WebException ex)
{
if (ex.Status == WebExceptionStatus.Timeout)
{
Console.WriteLine("連接超時(shí)。");
}
else
{
Console.WriteLine("發(fā)生錯(cuò)誤 WebException: {0}", ex.Message);
}
}
catch (Exception ex)
{
Console.WriteLine("發(fā)生錯(cuò)誤: {0}", ex.Message);
}
}
}
}FtpOperation 中其他的方法
/// <summary>
/// 執(zhí)行FTP操作的方法
/// </summary>
/// <param name="action">要執(zhí)行的操作</param>
private void ExecuteFtpOperation(Action action)
{
try
{
action.Invoke();
}
catch (WebException ex)
{
if (ex.Status == WebExceptionStatus.Timeout)
{
Console.WriteLine("連接超時(shí)。");
}
else
{
Console.WriteLine("發(fā)生錯(cuò)誤 WebException: { }", ex.Message);
}
}
catch (Exception ex)
{
Console.WriteLine("發(fā)生錯(cuò)誤: { }", ex.Message);
}
}
#region 文件查詢
/// <summary>
/// 遞歸查詢FTP服務(wù)器上所有文件和目錄
/// </summary>
/// <param name="ftpDirectoryPath">要查詢的目錄路徑</param>
public virtual List<FileInfo> RecursiveQueryAll(string ftpDirectoryPath = "")
{
List<FileInfo> list = new List<FileInfo>();
ExecuteFtpOperation(() =>
{
List<FileInfo> currentList = QueryAll(ftpDirectoryPath);
list.AddRange(currentList);
foreach (var fileInfo in currentList)
{
if (fileInfo.FileType == "Folder")
{
// 如果是文件夾,遞歸查詢
List<FileInfo> subList = RecursiveQueryAll(ftpDirectoryPath + "/" + fileInfo.FileName);
list.AddRange(subList);
}
}
});
return list;
}
/// <summary>
/// 查詢FTP服務(wù)器上所有文件和目錄
/// </summary>
/// <param name="ftpDirectoryPath">要查詢的目錄路徑</param>
public virtual List<FileInfo> QueryAll(string ftpDirectoryPath = "")
{
List<FileInfo> list = new List<FileInfo>();
ExecuteFtpOperation(() =>
{
FtpWebRequest request = (FtpWebRequest)WebRequest.Create(ftpServer + ftpDirectoryPath);
request.Method = WebRequestMethods.Ftp.ListDirectoryDetails;
request.Credentials = new NetworkCredential(userName, passWord);
request.Timeout = ;
using (FtpWebResponse response = (FtpWebResponse)request.GetResponse())
{
//Console.WriteLine("狀態(tài): { }", response.StatusDescription);
using (var responseStream = response.GetResponseStream())
{
if (responseStream != null)
{
using (var reader = new StreamReader(responseStream))
{
string line = reader.ReadLine();
while (!string.IsNullOrEmpty(line))
{
list.AddRange(ParseFTPFileList(line));
line = reader.ReadLine();
}
}
}
}
}
});
return list;
}
/// <summary>
/// 解析FTP服務(wù)器返回的文件列表信息,將其轉(zhuǎn)換為FileInfo對象列表
/// </summary>
/// <param name="ftpFileList">FTP服務(wù)器返回的文件列表信息</param>
/// <returns>包含文件信息的FileInfo對象列表</returns>
public virtual List<FileInfo> ParseFTPFileList(string ftpFileList)
{
// 解析FTP返回的文件列表信息并返回FileInfo對象列表
List<FileInfo> filesInfo = new List<FileInfo>();
// 按行分割FTP文件列表信息
string[] lines = ftpFileList.Split(new[] { "\r\n", "\r", "\n" }, StringSplitOptions.RemoveEmptyEntries);
foreach (string line in lines)
{
// 按空格分割行信息
string[] parts = line.Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries);
if (parts.Length >= )
{
string lastModifiedDateStr = parts[ ] + " " + parts[ ];
string format = "MM-dd-yy hh:mmtt"; // 指定日期時(shí)間的確切格式
DateTime lastModifiedDate;
DateTime.TryParseExact(lastModifiedDateStr, format, System.Globalization.CultureInfo.InvariantCulture, System.Globalization.DateTimeStyles.None, out lastModifiedDate);
// 提取文件大小信息
string fileSizeStr = parts[ ];
long fileSize;
string fileType = "Folder";
string fileName = string.Join(" ", parts, , parts.Length - );
if (fileSizeStr.Contains("DIR"))
{
fileSize = ;
}
else
{
fileType = Path.GetExtension(fileName);
fileSize = Convert.ToInt (fileSizeStr);
}
FileInfo fileInfo = new FileInfo(lastModifiedDate, fileSize, fileType, fileName);
filesInfo.Add(fileInfo);
}
}
return filesInfo;
}
#endregion
#region 判斷FTP服務(wù)器上是否存在指定文件夾 && 在FTP服務(wù)器上創(chuàng)建文件夾 &&刪除FTP服務(wù)器上的空文件夾
/// <summary>
/// 判斷FTP服務(wù)器上是否存在指定文件夾
/// </summary>
/// <param name="directoryPath">要檢查的文件夾路徑</param>
/// <returns>文件夾是否存在的布爾值</returns>
public virtual bool FtpDirectoryExists(string directoryPath)
{
FtpWebRequest request = (FtpWebRequest)WebRequest.Create(ftpServer + directoryPath);
request.Credentials = new NetworkCredential(userName, passWord);
request.Method = WebRequestMethods.Ftp.ListDirectory;
try
{
FtpWebResponse response = (FtpWebResponse)request.GetResponse();
response.Close();
return true;
}
catch (WebException ex)
{
FtpWebResponse response = (FtpWebResponse)ex.Response;
if (response.StatusCode == FtpStatusCode.ActionNotTakenFileUnavailable)
{
return false;
}
throw;
}
}
/// <summary>
/// 在FTP服務(wù)器上創(chuàng)建文件夾
/// </summary>
/// <param name="folderName">要?jiǎng)?chuàng)建的文件夾名稱</param>
public virtual void FtpCreateDirectory(string folderName)
{
ExecuteFtpOperation(() =>
{
string[] pathArray = folderName.Split('/');
var tempPath = "";
foreach (var path in pathArray)
{
if (path == "")
{
continue;
}
tempPath += path + "/";
if (FtpDirectoryExists(tempPath))
{
continue;
}
FtpWebRequest request = (FtpWebRequest)WebRequest.Create(ftpServer + tempPath);
request.Method = WebRequestMethods.Ftp.MakeDirectory;
request.Credentials = new NetworkCredential(userName, passWord);
using (FtpWebResponse response = (FtpWebResponse)request.GetResponse())
{
Console.WriteLine($"文件夾{path}創(chuàng)建成功。");
}
}
});
}
/// <summary>
/// 刪除FTP服務(wù)器上的空文件夾
/// </summary>
/// <param name="ftpFolderPath">FTP服務(wù)器上的空文件夾路徑</param>
public virtual void FtpDeleteFolder(string ftpFolderPath)
{
ExecuteFtpOperation(() =>
{
if (string.IsNullOrEmpty(ftpFolderPath))
{
return;
}
// 連接到 FTP 服務(wù)器
FtpWebRequest request = (FtpWebRequest)WebRequest.Create(ftpServer + ftpFolderPath);
request.Credentials = new NetworkCredential(userName, passWord);
request.Method = WebRequestMethods.Ftp.RemoveDirectory;
using (FtpWebResponse response = (FtpWebResponse)request.GetResponse())
{
Console.WriteLine($"文件夾{new DirectoryInfo(ftpFolderPath).Name}刪除成功!");
}
});
}
#endregion
#region 文件、文件夾刪除
/// <summary>
/// 刪除FTP服務(wù)器指定路徑下的多個(gè)文件
/// </summary>
/// <param name="directoryPath">要?jiǎng)h除文件的目錄路徑</param>
/// <param name="fileNames">要?jiǎng)h除的文件名數(shù)組</param>
public virtual void FtpDeleteFiles(string directoryPath, string[] fileNames)
{
ExecuteFtpOperation(() =>
{
foreach (var fileName in fileNames)
{
FtpWebRequest request = (FtpWebRequest)WebRequest.Create(ftpServer + directoryPath + "/" + fileName);
request.Method = WebRequestMethods.Ftp.DeleteFile;
request.Credentials = new NetworkCredential(userName, passWord);
using (FtpWebResponse response = (FtpWebResponse)request.GetResponse())
{
Console.WriteLine($"文件 '{fileName}' 刪除成功。");
}
}
});
}
/// <summary>
/// 遞歸刪除FTP服務(wù)器上的文件夾及其內(nèi)容
/// </summary>
/// <param name="directoryPath">要?jiǎng)h除的文件夾路徑</param>
public virtual void FtpDeleteFolders(string directoryPath)
{
ExecuteFtpOperation(() =>
{
if (!FtpDirectoryExists(directoryPath))
{
Console.WriteLine($"{directoryPath} 不存在!");
return;
}
// 獲取文件夾內(nèi)所有文件和子文件夾
var fileList = QueryAll(directoryPath);
foreach (var fileInfo in fileList)
{
// 刪除文件
FtpWebRequest request = (FtpWebRequest)WebRequest.Create(ftpServer + directoryPath + "/" + fileInfo.FileName);
request.Method = WebRequestMethods.Ftp.DeleteFile;
request.Credentials = new NetworkCredential(userName, passWord);
// 如果是文件夾,遞歸刪除
if (fileInfo.FileType == "Folder")
{
FtpDeleteFolders(directoryPath + "/" + fileInfo.FileName);
}
else
{
using (FtpWebResponse response = (FtpWebResponse)request.GetResponse())
{
Console.WriteLine($"文件 '{fileInfo.FileName}' 刪除成功。");
}
}
}
// 刪除空文件夾
FtpDeleteFolder(directoryPath);
});
}
#endregion
#region 文件移動
/// <summary>
/// 移動FTP服務(wù)器上的多個(gè)文件
/// </summary>
/// <param name="sourceDirectoryPath">源文件目錄路徑</param>
/// <param name="destinationDirectoryPath">目標(biāo)文件目錄路徑</param>
/// <param name="fileNames">要移動的文件名數(shù)組</param>
public virtual void FtpMoveFiles(string sourceDirectoryPath, string destinationDirectoryPath, string[] fileNames)
{
ExecuteFtpOperation(() =>
{
if (!FtpDirectoryExists(sourceDirectoryPath))
{
Console.WriteLine($"{sourceDirectoryPath} 目錄不存在!");
return;
}
if (!FtpDirectoryExists(destinationDirectoryPath))
{
FtpCreateDirectory(destinationDirectoryPath);
}
foreach (var fileName in fileNames)
{
FtpWebRequest request = (FtpWebRequest)WebRequest.Create(ftpServer + sourceDirectoryPath + "/" + fileName);
request.Method = WebRequestMethods.Ftp.Rename;
request.Credentials = new NetworkCredential(userName, passWord);
request.RenameTo = destinationDirectoryPath + "/" + fileName;
using (FtpWebResponse response = (FtpWebResponse)request.GetResponse())
{
Console.WriteLine($"文件 '{fileName}' 移動成功。");
}
}
});
}
/// <summary>
/// 移動整個(gè)文件夾到目標(biāo)位置
/// </summary>
/// <param name="sourceDirectoryPath">源文件夾路徑</param>
/// <param name="destinationDirectoryPath">目標(biāo)文件夾路徑</param>
public virtual void FtpMoveFolder(string sourceDirectoryPath, string destinationDirectoryPath)
{
ExecuteFtpOperation(() =>
{
if (!FtpDirectoryExists(sourceDirectoryPath))
{
Console.WriteLine($"{sourceDirectoryPath} 目錄不存在!");
return;
}
//destinationDirectoryPath = destinationDirectoryPath + "/" + new DirectoryInfo(sourceDirectoryPath).Name;//解決移動后源文件夾丟失的問題
// 創(chuàng)建目標(biāo)文件夾
if (!FtpDirectoryExists(destinationDirectoryPath))
{
FtpCreateDirectory(destinationDirectoryPath);
}
// 獲取源文件夾內(nèi)所有文件和子文件夾
var fileList = QueryAll(sourceDirectoryPath);
foreach (var fileInfo in fileList)
{
// 構(gòu)建源文件和目標(biāo)文件的完整路徑
string sourcePath = sourceDirectoryPath + "/" + fileInfo.FileName;
string destinationPath = destinationDirectoryPath + "/" + fileInfo.FileName;
// 如果是文件夾,遞歸移動
if (fileInfo.FileType == "Folder")
{
FtpMoveFolder(sourcePath, destinationPath);
}
else
{
// 創(chuàng)建源文件的FTP請求
FtpWebRequest request = (FtpWebRequest)WebRequest.Create(ftpServer + sourcePath);
request.Method = WebRequestMethods.Ftp.Rename; // 使用重命名操作實(shí)現(xiàn)移動
request.Credentials = new NetworkCredential(userName, passWord);
request.RenameTo = destinationPath; // 設(shè)置重命名目標(biāo)路徑
// 發(fā)起請求并獲取響應(yīng)
using (FtpWebResponse response = (FtpWebResponse)request.GetResponse())
{
Console.WriteLine($"文件 '{fileInfo.FileName}' 移動成功。");
}
}
}
if (!string.IsNullOrEmpty(sourceDirectoryPath))
{
// 刪除源文件夾
FtpDeleteFolder(sourceDirectoryPath);
}
});
}
#endregion
#region 文件上傳【文件批量上傳&&文件夾上傳】
/// <summary>
/// 上傳文件到FTP服務(wù)器
/// </summary>
/// <param name="filePath">要上傳的文件路徑</param>
/// <param name="directoryPath">目標(biāo)文件夾路徑</param>
public virtual void FtpUploadFile(string filePath, string directoryPath = "")
{
ExecuteFtpOperation(() =>
{
if (!FtpDirectoryExists(directoryPath))
{
FtpCreateDirectory(directoryPath);
}
using (WebClient client = new WebClient())
{
client.Credentials = new NetworkCredential(userName, passWord); ;
client.UploadFile(ftpServer + directoryPath + "/" + Path.GetFileName(filePath), WebRequestMethods.Ftp.UploadFile, filePath);
Console.WriteLine($"{filePath}文件上傳成功。");
}
});
}
/// <summary>
/// 遞歸上傳文件夾到FTP服務(wù)器
/// </summary>
/// <param name="localFolderPath">本地文件夾路徑</param>
/// <param name="ftpDirectoryPath">FTP服務(wù)器目標(biāo)文件夾路徑</param>
public virtual void FtpUploadFolder(string localFolderPath, string ftpDirectoryPath)
{
// 檢查本地文件夾是否存在
if (!Directory.Exists(localFolderPath))
{
Console.WriteLine("本地文件夾不存在。");
return;
}
// 獲取文件夾名稱
string folderName = new DirectoryInfo(localFolderPath).Name;
// 構(gòu)建FTP服務(wù)器上的目標(biāo)路徑
string rootPath = (string.IsNullOrEmpty(ftpDirectoryPath) ? "" : ftpDirectoryPath + "/");
// 如果目標(biāo)文件夾在FTP服務(wù)器上不存在,則創(chuàng)建
if (!FtpDirectoryExists(rootPath + folderName))
{
FtpCreateDirectory(rootPath + folderName);
}
// 獲取文件夾中的所有文件
string[] files = Directory.GetFiles(localFolderPath);
// 逐個(gè)上傳文件
foreach (string file in files)
{
FtpUploadFile(file, rootPath + folderName);
}
// 獲取文件夾中的所有子文件夾
string[] subDirectories = Directory.GetDirectories(localFolderPath);
// 逐個(gè)處理子文件夾
foreach (string subDirectory in subDirectories)
{
// 遞歸上傳子文件夾
FtpUploadFolder(subDirectory, rootPath + folderName);
}
Console.WriteLine($"{localFolderPath} 文件夾上傳成功。");
}
/// <summary>
/// 上傳多個(gè)文件夾到FTP服務(wù)器
/// </summary>
/// <param name="filePath">要上傳的文件夾路徑</param>
/// <param name="ftpDirectoryPath">目標(biāo)文件夾路徑</param>
public virtual void FtpUploadFolders(string[] localDirectories, string ftpDirectoryPath = "")
{
foreach (string localDirectory in localDirectories)
{
FtpUploadFolder(localDirectory, ftpDirectoryPath);
}
}
#endregion
#region 文件下載
/// <summary>
/// 從FTP服務(wù)器下載文件到本地
/// </summary>
/// <param name="remoteFilePaths">要下載的遠(yuǎn)程文件路徑數(shù)組</param>
/// <param name="localDirectory">本地目錄路徑</param>
public virtual void FtpDownloadFile(string[] remoteFilePaths, string localDirectory)
{
ExecuteFtpOperation(() =>
{
// 檢查本地路徑是否存在,如果不存在則創(chuàng)建
if (!Directory.Exists(localDirectory))
{
Directory.CreateDirectory(localDirectory);
}
using (WebClient client = new WebClient())
{
client.Credentials = new NetworkCredential(userName, passWord);
foreach (var remoteFilePath in remoteFilePaths)
{
string fileName = remoteFilePath.Substring(remoteFilePath.LastIndexOf("/") + );
string localFilePath = Path.Combine(localDirectory, fileName);
try
{
client.DownloadFile(ftpServer + remoteFilePath, localFilePath);
Console.WriteLine($"文件 '{fileName}' 下載成功。");
}
catch (WebException ex)
{
Console.WriteLine($"下載文件 '{fileName}' 時(shí)出錯(cuò): {ex.Message}");
// Handle the exception as needed
}
}
}
});
}
/// <summary>
/// 遞歸從FTP服務(wù)器下載文件夾到本地
/// </summary>
/// <param name="remoteDirectoryPath">要下載的遠(yuǎn)程文件夾路徑</param>
/// <param name="localDirectory">本地目錄路徑</param>
public virtual void FtpDownloadFolder(string remoteDirectoryPath, string localDirectory)
{
ExecuteFtpOperation(() =>
{
// 檢查本地路徑是否存在,如果不存在則創(chuàng)建
if (!Directory.Exists(localDirectory))
{
Directory.CreateDirectory(localDirectory);
}
// 獲取遠(yuǎn)程文件夾內(nèi)所有文件和子文件夾
var fileList = QueryAll(remoteDirectoryPath);
foreach (var fileInfo in fileList)
{
string remotePath = remoteDirectoryPath + "/" + fileInfo.FileName;
string localPath = Path.Combine(localDirectory, fileInfo.FileName);
if (fileInfo.FileType == "Folder")
{
// 如果是文件夾,遞歸下載
string newLocalDirectory = Path.Combine(localDirectory, fileInfo.FileName);
Directory.CreateDirectory(newLocalDirectory);
FtpDownloadFolder(remotePath, newLocalDirectory);
}
else
{
// 如果是文件,下載到本地
using (WebClient client = new WebClient())
{
client.Credentials = new NetworkCredential(userName, passWord);
client.DownloadFile(ftpServer + remotePath, localPath);
Console.WriteLine($"文件 '{fileInfo.FileName}' 下載成功。");
}
}
}
});
}
#endregion
調(diào)用示例
// FTP 服務(wù)器地址
string ftpServer = "ftp://127.0.0.1:27/";
// FTP 服務(wù)器用戶名
string userName = "Administrator";
// FTP 服務(wù)器密碼
string password = "admin";
FtpTest ftp = new FtpTest(ftpServer, userName, password);
//ftp.QueryAll("/Template"); //查詢
ftp.FtpDeleteFolders("");//刪除所有
ftp.FtpUploadFolder("e:\\CoaTemplate", "");//將文件夾的內(nèi)容上傳到根目錄
ftp.FtpUploadFolder(@"D:\GitCode\Blog.Core", "/gitCode/Blog.Core");//將本地文件夾的內(nèi)容上傳到指定目錄
var data = ftp.RecursiveQueryAll("");//查詢所有文件信息
ftp.FtpMoveFolder("/CoaTemplate", "/1/CoaTemplate");//文件夾移動
ftp.FtpDownloadFolder("/1", "d:\\1\\"); //將ftp服務(wù)器的指定文件夾下載到本地目錄項(xiàng)目地址:https://github.com/yycb1994/FtpSiteManager
以上就是使用C#操作ftp服務(wù)器的示例代碼的詳細(xì)內(nèi)容,更多關(guān)于C#操作ftp服務(wù)器的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Unity的IPreprocessBuild實(shí)用案例深入解析
這篇文章主要為大家介紹了Unity的IPreprocessBuild實(shí)用案例深入解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-05-05
Unity通用泛型單例設(shè)計(jì)模式(普通型和繼承自MonoBehaviour)
這篇文章主要介紹了Unity通用泛型單例設(shè)計(jì)模式,分為普通型和繼承MonoBehaviour,幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下2020-07-07
C#實(shí)現(xiàn)快速將數(shù)據(jù)寫入Excel單元格
這篇文章主要為大家詳細(xì)介紹了如何使用C#實(shí)現(xiàn)快速將數(shù)據(jù)寫入Excel單元格,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2024-03-03
Unity中的RegisterPlugins實(shí)用案例深入解析
這篇文章主要為大家介紹了Unity中的RegisterPlugins實(shí)用案例深入解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-05-05
C#調(diào)用mmpeg進(jìn)行各種視頻轉(zhuǎn)換的類實(shí)例
這篇文章主要介紹了C#調(diào)用mmpeg進(jìn)行各種視頻轉(zhuǎn)換的類,實(shí)例分析了C#調(diào)用mmpeg操作視頻文件的技巧,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2015-03-03
C#使用linq對數(shù)組進(jìn)行篩選排序的方法
這篇文章主要介紹了C#使用linq對數(shù)組進(jìn)行篩選排序的方法,實(shí)例分析了C#實(shí)用linq擴(kuò)展進(jìn)行數(shù)組排序的技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-04-04

