日期:2014-05-18  浏览次数:20456 次

100分 请教c# 如何实现用ftp类上传目录文件
将本地目录中的所有文件(包括子目录)用ftp的方式上传到远程服务器中的某个目录中,要求保存远程目录的目录结构与本地目录结构一致。

网上有一些多文件ftp上传的实例,但如何实现包含目录结构的上传呢

------解决方案--------------------
可以打包成Rar,压缩上传
//exeFile为服务器winRAR exe文件地址,比如"C:\Program Files\WinRAR\WinRAR.exe"
C# code
 public static void UnZip(string exeFile,string folder,string filePath)
        { 
         
           //解压Rar文件  
           System.Diagnostics.Process Process1=new Process();
           Process1.StartInfo.FileName = exeFile;
           Directory.CreateDirectory(folder); //创建解压文件夹  
           Process1.StartInfo.Arguments = " x -inul -y " + filePath + " " + folder;  
           Process1.Start();//解压开始  
           while(!Process1.HasExited)           //等待解压的完成  
           {  
           }
           File.Delete(filePath);//删除rar文件

------解决方案--------------------
C# code

ftp.Connect();
if (ftp.Connected)
{
   ListFiles(new DirectoryInfo(path););
}


public  void ListFiles(FileSystemInfo info)
        {
            if (!info.Exists) return;

            DirectoryInfo dir = info as DirectoryInfo;
             
            if (dir == null) return;

            FileSystemInfo[] files = dir.GetFileSystemInfos();
            for (int i = 0; i < files.Length; i++)
            {
                FileInfo file = files[i] as FileInfo;
                //是文件 
                if (file != null)
                {
                    ftp.Put(file.FullName);//上传文件
                }
                //对于子目录,进行递归调用 
                else
                {
                  ftp.MkDir(files[i].Name);//新建目录
                    ftp.ChDir(files[i].Name);//进入该目录                        
                    ListFiles(files[i]);
                  ftp.ChDir("..");//返回上一级目录
                }
            }
        }

------解决方案--------------------
C# code

获得某一目录下第一级的所有文件和文件夹列表,很容易办到:
DirectoryInfo di=new DirectoryInfo(strBaseDir);//strBaseDir是起始目录,绝对地址
DirectoryInfo[] diA=di.GetDirectories();//获得了所有一级子目录
FileInfo[] fiA=di.GetFiles();//获得了所有起始目录下的文件
要是想获得某一目录下的所有文件和目录(包含所有子目录),那该怎么办呢?目录都是一层套一层的,我们不能预知某个目录的深度,只有获得了父节点,才有可能了解子节点,解决这个问题,只有递归这个概念了。
那么什么是递归呢?请不会C语言的朋友先去看书吧,我这里只简单的说一下我的理解:递归就是一个方法,在这个方法里面,再次调用它本身这个方法,从而描述了某一事物运作的深度…… - - 不废话了,看代码吧:
public ArrayList al=new ArrayList();
//我把ArrayList当成动态数组用,非常好用
public void GetAllDirList(string strBaseDir)
{
    DirectoryInfo di=new DirectoryInfo(strBaseDir);
    DirectoryInfo[] diA=di.GetDirectories();
   for(int i=0;i<diA.Length;i++)
    {
     al.Add(diA[i].FullName);
    //diA[i].FullName是某个子目录的绝对地址,把它记录在ArrayList中
     GetAllDirList(diA[i].FullName);
    //注意:递归了。逻辑思维正常的人应该能反应过来
    }
}

最后,如何把所有目录信息从ArrayList中取出来呢?如下:
for(int i=0;i<al.Count;i++)
{
     textBox1.AppendText(al[i].ToString()+" ");
    //textBox1是容器,拷贝我的代码,注意要换一个你自己的容器
}


 

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.IO;
using System.Collections;

namespace bianlimulu
{
    public partial class Form1 : Form
    {

        public ArrayList a1 = new ArrayList(); //引用是 using System.Collections;
        public void GetAllDirList(string strBaseDir)
        {
            DirectoryInfo di = new DirectoryInfo(strBaseDir); //引用using System.IO;
            DirectoryInfo[] diA = di.GetDirectories();
            for(int i = 0; i < diA.Length; i++)
            {
                a1.Add(diA[i].FullName);
                GetAllDirList(diA[i].FullName);
            }
        }


        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            DialogResult aa = folderBrowserDialog1.ShowDialog();
            if (aa == DialogResult.OK)