0

私のプログラムでは、FTP サーバーに照会して情報の読み取りとアップロードを行うことが何度かあります。これらすべてを 1 つの FTP クラスに結合してすべてを処理するにはどうすればよいですか?

    private static void UploadToFTP(string[] FTPSettings)
    {
        try
        {
            FtpWebRequest request = (FtpWebRequest)WebRequest.Create(FTPSettings[0]);
            request.Method = WebRequestMethods.Ftp.MakeDirectory;

            request.Credentials = new NetworkCredential(FTPSettings[1], FTPSettings[2]);

            FtpWebResponse response = (FtpWebResponse)request.GetResponse();
        }
        catch
        {
        }

        try 
        {
            FtpWebRequest request = (FtpWebRequest)WebRequest.Create(FTPSettings[0] + Path.GetFileName(file));
            request.Method = WebRequestMethods.Ftp.UploadFile;

            request.Credentials = new NetworkCredential(FTPSettings[1], FTPSettings[2]);

            StreamReader source = new StreamReader(file);
            byte[] fileContents = Encoding.UTF8.GetBytes(source.ReadToEnd());
            source.Close();
            request.ContentLength = fileContents.Length;

            Stream requestStream = request.GetRequestStream();
            requestStream.Write(fileContents, 0, fileContents.Length);
            requestStream.Close();

            FtpWebResponse response = (FtpWebResponse)request.GetResponse();

            response.Close();

            RegenLog();
        }
        catch (Exception e)
        {
            File.AppendAllText(file, string.Format("{0}{0}Upload Failed - ({2}) - {1}{0}", nl, System.DateTime.Now, e.Message.ToString()));
        }
    }

    private static void CheckBlacklist(string[] FTPSettings)
    {
        try
        {
            FtpWebRequest request = (FtpWebRequest)WebRequest.Create(FTPSettings[0] + "blacklist.txt");
            request.Credentials = new NetworkCredential(FTPSettings[1], FTPSettings[2]);

            using (WebResponse response = request.GetResponse())
            {
                using (Stream stream = response.GetResponseStream())
                {
                    using (TextReader reader = new StreamReader(stream))
                    {
                        string blacklist = reader.ReadToEnd();

                        if (blacklist.Contains(Environment.UserName))
                        {
                            File.AppendAllText(file, string.Format("{0}{0}Logger terminated - ({2}) - {1}{0}", nl, System.DateTime.Now, "Blacklisted"));
                            uninstall = true;
                        }
                    }
                }
            }
        }
        catch (Exception e)
        {
            File.AppendAllText(file, string.Format("{0}{0}FTP Error - ({2}) - {1}{0}", nl, System.DateTime.Now, e.Message.ToString()));
        }
    }

    private static void CheckUpdate(string[] FTPSettings)
    {
        try
        {
            FtpWebRequest request = (FtpWebRequest)WebRequest.Create(FTPSettings[0] + "update.txt");
            request.Credentials = new NetworkCredential(FTPSettings[1], FTPSettings[2]);

            using (WebResponse response = request.GetResponse())
            {
                using (Stream stream = response.GetResponseStream())
                {
                    using (TextReader reader = new StreamReader(stream))
                    {
                        string newVersion = reader.ReadToEnd();

                        if (newVersion != version)
                        {
                            update = true;
                        }
                    }
                }
            }
        }
        catch (Exception e)
        {
            File.AppendAllText(file, string.Format("{0}{0}FTP Error - ({2}) - {1}{0}", nl, System.DateTime.Now, e.Message.ToString()));
        }
    }

私のコードも少し一貫性がなく、乱雑であることはわかっていますが、C# で FTP を使用するのはこれが初めてです。どなたかアドバイスお願いします!

4

3 に答える 3

5

理想的なオプションは、IDisposableインターフェイスを実装する「マネージャー」タイプのクラスを使用することです。

いくつかの内部フィールド (コンストラクターで初期化される) と 1 つの接続 (コンストラクターで初期化される) を持つようにします。それ以外の場合は、復元を試みてから例外をスローします。

Dispose メソッドでは、接続を閉じます。

これにより、それがどのように見えるかについてのアイデアが得られるはずです。

// Partial class declaration
class FTPManager : IDisposable
{
    void Dispose();
    FTPManager(string host, string username, string password)
    void UploadFile(string remoteDir, string localfile);
    void CreateDirectory(string remotePath);
    void DeleteFile(string remotePath);
}

// and here I use it:
void Main()
{
    using (var manager = new FTPManager("ftp.somehosting.org","login","password")) {
        manager.CreateDirectory("/newfolder/");
        manager.UploadFile("/newfolder/","C:\\Somefile.txt");
        manager.DeleteFile("/newfolder/anotherfile.txt");
    }
}
于 2012-12-24T08:28:37.367 に答える
1

WinSCP ライブラリを参照してください。WinSCP には多くの機能があり、(本質的に安全でない FTP) よりも安全なプロトコルをサポートしています。最近のリリースでは、スクリプト メカニズムも備えています。

于 2012-12-28T18:27:12.907 に答える
0

1 つの接続ですべてのコマンドを実行できる他の FTP .NET ライブラリを使用する必要があります (インターネットには無料のものや商用のものも多数あります)。それははるかに速く動作します。

于 2012-12-21T20:06:03.793 に答える