簡體   English   中英

如何通過C#Winform中的按鈕使用ftp Web請求返回上一個目錄?

[英]How to go back to the previous directory using ftp web request via button back in c# winform?

我正在使用c#Windows Form Application和ftpWebRequest,正在執行目錄列表。 我有一個列表框,該列表框將顯示文件夾,通過在列表框中使用事件DoubleClick,列表框中的雙擊文件夾或項目將顯示其內容。 現在我的問題是我不知道如何使用“后退”按鈕返回上一個目錄。

這是我的代碼文件:

namespace myFTPClass  
{
    public class myFTP
    {
       public string user;
       public string pass;
    public delegate void cThread1(string thread1);
    public event EventHandler EH;

    public List<string> myDIR = new List<string>();

    public void getDirectoryList(string getDirectory)
    {
        try
        {
            FtpWebRequest fwr = FtpWebRequest.Create(getDirectory) as FtpWebRequest;
            fwr.Credentials = new NetworkCredential(user, pass);
            fwr.UseBinary = true;
            fwr.UsePassive = true;
            fwr.KeepAlive = true;
            fwr.Method = WebRequestMethods.Ftp.ListDirectory;

            StreamReader sr = new StreamReader(fwr.GetResponse().GetResponseStream());
            while (!sr.EndOfStream)
            {
                myDIR.Add(sr.ReadLine());
            }
        }
        catch(Exception we)
        {
            myDIR.Clear();
            string msg = we.Message;
        }
    }

    void myCallBackMethod(IAsyncResult ar)
    {
        cThread1 myThread = (cThread1)((System.Runtime.Remoting.Messaging.AsyncResult)ar).AsyncDelegate;
        myThread.EndInvoke(ar);
        if (EH != null) EH(this, null);
    }

    public void Async_getDirectoryList(string dir)
    {
        AsyncCallback ac = new AsyncCallback(myCallBackMethod);
        cThread1 myThread = new cThread1(getDirectoryList);
        myThread.BeginInvoke(dir, ac, null);
    }
}                                                        

}

這是我的Form1:

namespace my_ftp_v0._01
{
    public partial class Form1 : Form
    {
        myFTP ftp = new myFTP();
        public Form1()
        {
            InitializeComponent();
            this.Load += new EventHandler(Form1_Load);
            btn_connect.Click += new EventHandler(btn_connect_Click);
            listBox1.DoubleClick += new EventHandler(listBox1_DoubleClick);
            btn_back.Click += new EventHandler(btn_back_Click);
            ftp.EH += new EventHandler(ftp_EH);   
        }
    void btn_back_Click(object sender, EventArgs e)
    {

    }

    void listBox1_DoubleClick(object sender, EventArgs e)
    {
        string forward = "ftp://127.0.0.1/" + listBox1.SelectedItem.ToString();
        listBox1.Items.Clear();
        ftp.myDIR.Clear();
        ftp.Async_getDirectoryList(forward);
    }

    void Form1_Load(object sender, EventArgs e)
    {
        txt_dir.Text = "ftp://127.0.0.1/";
        txt_pass.PasswordChar = '‡';
    }

    void ftp_EH(object sender, EventArgs e)
    {
            if (InvokeRequired)
            {
                EventHandler eh = new EventHandler(ftp_EH);
                this.Invoke(eh, new object[] { sender, e });
                return;
            }

            for (int i = 0; i < ftp.myDIR.Count; i++)
            {
                listBox1.Items.Add(ftp.myDIR[i]);
            }
    }

    void btn_connect_Click(object sender, EventArgs e)
    {

            ftp.Async_getDirectoryList(txt_dir.Text);
            ftp.user = txt_user.Text;
            ftp.pass = txt_pass.Text;   
    }
}

}

  1. 將SetDirectoryList移至其自己的方法
  2. 向您的班級添加一個Stack對象以跟蹤您的請求
  3. 當用戶雙擊時,將請求添加到堆棧中,然后設置目錄。
  4. 當用戶單擊“后退”按鈕時,檢查堆棧是否有請求(如果有),將其彈出並調用set directory方法。

像這樣

 public partial class Form1 : Form
  {
      myFTP ftp = new myFTP();
      Stack _requestStack = new Stack();//Stack to store requests
      public Form1()
      {
          InitializeComponent();
          this.Load += new EventHandler(Form1_Load);
          btn_connect.Click += new EventHandler(btn_connect_Click);
          listBox1.DoubleClick += new EventHandler(listBox1_DoubleClick);
          btn_back.Click += new EventHandler(btn_back_Click);
          ftp.EH += new EventHandler(ftp_EH);   
      }
      void btn_back_Click(object sender, EventArgs e)
      {
          if(_requestStack.Count > 0)
          {
              string directoryPath = (string)_requestStack.Pop();
              SetDirectoryList(directoryPath);
           }

     }

    void listBox1_DoubleClick(object sender, EventArgs e)
    {
       string  directoryPath = listBox1.SelectedItem.ToString();
       _stack.Push(directoryPath);
       SetDirectoryList(directoryPath);
    }

    void SetDirectoryList(string directoryPath)
    {
             string forward = "ftp://127.0.0.1/" + directoryPath;
            listBox1.Items.Clear();
            ftp.myDIR.Clear();
            ftp.Async_getDirectoryList(forward);
    }

void btn_back_Click(對象發送者,EventArgs e)

{

create.server = create.server.TrimEnd('/');

create.server = create.server.Remove(create.server.LastIndexOf('/')+ 1);

        listBox1.Items.Clear();
        ftp.myDIR.Clear();
        ftp.Async_getDirectoryList("");
    }

我已經對后退按鈕執行了此代碼,並且可以正常工作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM