C#使用FTP上传整个目录
我想做的是在C#(C Sharp)中使用FTP上传一个网站。所以我需要上传文件夹中的所有文件和文件夹,保持其结构。我使用这个FTP类:用于实际上传 我得出的结论是,我需要编写一个递归方法,遍历主目录的每个子目录,并上传其中的所有文件和文件夹。这将使我的文件夹精确复制到FTP。问题是。。。我不知道如何编写这样的方法。我以前写过递归方法,但对FTP部分我是新手 这就是我到目前为止所做的:C#使用FTP上传整个目录,c#,recursion,upload,ftp,directory,C#,Recursion,Upload,Ftp,Directory,我想做的是在C#(C Sharp)中使用FTP上传一个网站。所以我需要上传文件夹中的所有文件和文件夹,保持其结构。我使用这个FTP类:用于实际上传 我得出的结论是,我需要编写一个递归方法,遍历主目录的每个子目录,并上传其中的所有文件和文件夹。这将使我的文件夹精确复制到FTP。问题是。。。我不知道如何编写这样的方法。我以前写过递归方法,但对FTP部分我是新手 这就是我到目前为止所做的: private void recursiveDirectory(string directoryPath)
private void recursiveDirectory(string directoryPath)
{
string[] filePaths = null;
string[] subDirectories = null;
filePaths = Directory.GetFiles(directoryPath, "*.*");
subDirectories = Directory.GetDirectories(directoryPath);
if (filePaths != null && subDirectories != null)
{
foreach (string directory in subDirectories)
{
ftpClient.createDirectory(directory);
}
foreach (string file in filePaths)
{
ftpClient.upload(Path.GetDirectoryName(directoryPath), file);
}
}
}
但这远未完成,我不知道如何继续。我相信比我更需要知道这一点!提前感谢:)
哦,还有。。。如果它也报告它的进度那就太好了:)(我正在使用进度条)
编辑:
可能还不清楚。。。如何使用FTP上传包含所有子目录和文件的目录?除非您这样做是为了好玩或自我改进,否则请使用商业模块。我可以推荐一个,但我肯定还有其他的
注意:我很确定这确实回答了前面提到的问题,我想做的是用C#(C Sharp)中的FTP上传一个网站。我写了一个FTP类,并将其包装在WinForms用户控件中。您可以在文章中看到我的代码。问题已解决!:) 好的,所以我设法写了myslef方法。如果有人需要,请随意复制:
private void recursiveDirectory(string dirPath, string uploadPath)
{
string[] files = Directory.GetFiles(dirPath, "*.*");
string[] subDirs = Directory.GetDirectories(dirPath);
foreach (string file in files)
{
ftpClient.upload(uploadPath + "/" + Path.GetFileName(file), file);
}
foreach (string subDir in subDirs)
{
ftpClient.createDirectory(uploadPath + "/" + Path.GetFileName(subDir));
recursiveDirectory(subDir, uploadPath + "/" + Path.GetFileName(subDir));
}
}
它工作得很好:)我编写了一个可重用类,将整个目录上载到windows server上的
ftp站点,
该程序还重命名该文件夹的旧版本(我使用它将windows service程序上载到服务器)。
也许有些人需要这个:
class MyFtpClient
{
protected string FtpUser { get; set; }
protected string FtpPass { get; set; }
protected string FtpServerUrl { get; set; }
protected string DirPathToUpload { get; set; }
protected string BaseDirectory { get; set; }
public MyFtpClient(string ftpuser, string ftppass, string ftpserverurl, string dirpathtoupload)
{
this.FtpPass = ftppass;
this.FtpUser = ftpuser;
this.FtpServerUrl = ftpserverurl;
this.DirPathToUpload = dirpathtoupload;
var spllitedpath = dirpathtoupload.Split('\\').ToArray();
// last index must be the "base" directory on the server
this.BaseDirectory = spllitedpath[spllitedpath.Length - 1];
}
public void UploadDirectory()
{
// rename the old folder version (if exist)
RenameDir(BaseDirectory);
// create a parent folder on server
CreateDir(BaseDirectory);
// upload the files in the most external directory of the path
UploadAllFolderFiles(DirPathToUpload, BaseDirectory);
// loop trough all files in subdirectories
foreach (string dirPath in Directory.GetDirectories(DirPathToUpload, "*",
SearchOption.AllDirectories))
{
// create the folder
CreateDir(dirPath.Substring(dirPath.IndexOf(BaseDirectory), dirPath.Length - dirPath.IndexOf(BaseDirectory)));
Console.WriteLine(dirPath.Substring(dirPath.IndexOf(BaseDirectory), dirPath.Length - dirPath.IndexOf(BaseDirectory)));
UploadAllFolderFiles(dirPath, dirPath.Substring(dirPath.IndexOf(BaseDirectory), dirPath.Length - dirPath.IndexOf(BaseDirectory))
}
}
private void UploadAllFolderFiles(string localpath, string remotepath)
{
string[] files = Directory.GetFiles(localpath);
// get only the filenames and concat to remote path
foreach (string file in files)
{
// full remote path
var fullremotepath = remotepath + "\\" + Path.GetFileName(file);
// local path
var fulllocalpath = Path.GetFullPath(file);
// upload to server
Upload(fulllocalpath, fullremotepath);
}
}
public bool CreateDir(string dirname)
{
try
{
WebRequest request = WebRequest.Create("ftp://" + FtpServerUrl + "/" + dirname);
request.Method = WebRequestMethods.Ftp.MakeDirectory;
request.Proxy = new WebProxy();
request.Credentials = new NetworkCredential(FtpUser, FtpPass);
using (var resp = (FtpWebResponse)request.GetResponse())
{
if (resp.StatusCode == FtpStatusCode.PathnameCreated)
{
return true;
}
else
{
return false;
}
}
}
catch
{
return false;
}
}
public void Upload(string filepath, string targetpath)
{
using (WebClient client = new WebClient())
{
client.Credentials = new NetworkCredential(FtpUser, FtpPass);
client.Proxy = null;
var fixedpath = targetpath.Replace(@"\", "/");
client.UploadFile("ftp://" + FtpServerUrl + "/" + fixedpath, WebRequestMethods.Ftp.UploadFile, filepath);
}
}
public bool RenameDir(string dirname)
{
var path = "ftp://" + FtpServerUrl + "/" + dirname;
string serverUri = path;
try
{
FtpWebRequest request = (FtpWebRequest)WebRequest.Create(serverUri);
request.Method = WebRequestMethods.Ftp.Rename;
request.Proxy = null;
request.Credentials = new NetworkCredential(FtpUser, FtpPass);
// change the name of the old folder the old folder
request.RenameTo = DateTime.Now.ToString("yyyyMMddHHmmss");
FtpWebResponse response = (FtpWebResponse)request.GetResponse();
using (var resp = (FtpWebResponse)request.GetResponse())
{
if (resp.StatusCode == FtpStatusCode.FileActionOK)
{
return true;
}
else
{
return false;
}
}
}
catch
{
return false;
}
}
}
创建该类的实例:
static void Main(string[] args)
{
MyFtpClientftp = new MyFtpClient(ftpuser, ftppass, ftpServerUrl, @"C:\Users\xxxxxxxxxxx");
ftp.UploadDirectory();
Console.WriteLine("DONE");
Console.ReadLine();
}
让我们先解决一个简单的问题。编写一个方法,循环遍历父文件夹中的每个文件夹,并在相关网站上创建它。一旦你这样做了,上传每个文件夹中的每个文件应该很容易。你做的还不够,我们帮不了你。我不敢相信你居然有勇气提出功能请求……要创建进度条,你需要获得所有需要上传的文件。我会将文件路径存储在一个列表中。然后循环文件路径,将其上载到FTP服务器。每次上传后,更新进度。通过使用文件路径存储文件大小,可以获得更精确的条形图。然后,在上载每个文件时,按文件大小增加进度。如果您需要,我可以在后面添加一个示例。如果您提到您使用了外部库和外部库来编写代码,这会很有用,其中包括许多其他不是您编写的代码。他在问题中这样做了。但是,是的,我也希望冗余,而不是必须寻找链接。这最终会远程创建所有文件和目录,但所有文件的文件大小都是0B???奇怪。我不知道那门课对任何人都有什么作用。通过将FileMode
值更改为Open
:FileStream localFileStream=newfilestream(localFile,FileMode.Open),我可以修复他们的upload()
方法代码>好极了!!这是迄今为止我找到的最好的解决办法。它只是缺少了目标文件夹,使它变得更好。