9

私がやろうとしているのは、C#(C Sharp)でFTPを使用してWebサイトをアップロードすることです。そのため、フォルダ内のすべてのファイルとフォルダを、その構造を維持したままアップロードする必要があります。私はこのFTPクラスを使用しています:http://www.codeproject.com/Tips/443588/Simple-Csharp-FTP-Class実際のアップロードに。

メインディレクトリのすべてのサブディレクトリを調べ、その中のすべてのファイルとフォルダをアップロードする再帰的なメソッドを作成する必要があるという結論に達しました。これにより、フォルダの正確なコピーがFTPに作成されます。問題は...私にはそのようなメソッドを書く方法がわかりません。以前に再帰メソッドを作成しましたが、FTPの部分は初めてです。

これは私がこれまでに持っているものです:

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ですべてのサブディレクトリとファイルを含むディレクトリをアップロードするにはどうすればよいですか?

4

4 に答える 4

18

問題が解決しました!:)

よし、メソッド 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));
        }
    }

それは非常にうまく機能します:)

于 2012-11-09T19:54:19.463 に答える
4

FTP クラスを作成し、それを WinForms ユーザー コントロールにラップしました。An FtpClient Class and WinForm Controlの記事で私のコードを確認できます。

于 2012-11-09T17:04:28.647 に答える
1

ディレクトリ全体ftp siteをWindowsサーバーにアップロードする再利用可能なクラスを作成
しました。プログラムは、そのフォルダーの古いバージョンの名前も変更します(Windowsサービスプログラムをサーバーにアップロードするために使用します)。たぶん、これが必要な人もいます:

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();
}
于 2018-08-23T13:56:28.393 に答える
0

楽しみや自己改善のためにこれを行っているのでない限り、商用モジュールを使用してください。Chilkatの1 つをお勧めしますが、他にもあると確信しています。

注:これで、前述の問題が解決されると確信しています。私がやろうとしているのは、C# (C Sharp) で FTP を使用して Web サイトをアップロードすることです。

于 2012-11-09T16:48:51.320 に答える