C# Upload whole directory using FTP

后端 未结 4 975
再見小時候
再見小時候 2021-01-04 20:50

What I\'m trying to do is to upload a website using FTP in C# (C Sharp). So I need to upload all files and folders within a folder, keeping its structure. I\'m using this FT

相关标签:
4条回答
  • 2021-01-04 21:12

    Unless you're doing this for fun or self-improvement, use a commercial module. I can recommend one from Chilkat, but I'm sure there are others.

    Note: I'm pretty sure this does answer the stated problem, What I'm trying to do is to upload a website using FTP in C# (C Sharp).

    0 讨论(0)
  • 2021-01-04 21:15

    Problem Solved! :)

    Alright so I managed to write the method myslef. If anyone need it feel free to copy:

    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));
            }
        }
    

    It works very well :)

    0 讨论(0)
  • 2021-01-04 21:20

    I wrote an FTP classe and also wrapped it in a WinForms user control. You can see my code in the article An FtpClient Class and WinForm Control.

    0 讨论(0)
  • 2021-01-04 21:27

    I wrote a reusable class to upload entire directory to an ftp site on windows server,
    the program also renames the old version of that folder (i use it to upload my windows service program to the server). maybe some need this:

    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;
            }
        }
    }
    

    Create an instance of that class:

    static void Main(string[] args)
    {
        MyFtpClientftp = new MyFtpClient(ftpuser, ftppass, ftpServerUrl, @"C:\Users\xxxxxxxxxxx");
        ftp.UploadDirectory();
        Console.WriteLine("DONE");
        Console.ReadLine();
    }
    
    0 讨论(0)
提交回复
热议问题