小弟在做一个需要展现FTP文件的页面(C#)。看了很多遍历的方法,但是都好像不能满足我的要求,我需要:展示所有文件夹、子文件夹、文件,并能展现其结构关系(Tree)。由于FTP与页面服务器是同一台,所以遍历系统文件目录也行,最好能输出XML,并不需要提供下载,请问诸位大哥如何实现?

解决方案 »

  1.   

    http://www.cnblogs.com/sxlfybb/archive/2008/03/12/1101417.html这里,是使用treeview输出树的。可以参考一下。
      

  2.   

    现在不用遍历FTP了,遍历本地目录就行了,我用以下代码想得到有结构的文件列表但是输出不对,请大家帮忙看看。 public ArrayList al = new ArrayList();
        public int aaa = 0;
        public void GetAllDirList(string strBaseDir)
        {
     
            DirectoryInfo di = new DirectoryInfo(strBaseDir);
            DirectoryInfo[] diA = di.GetDirectories();
            if (aaa == 0)
            {
                FileInfo[] fis2 = di.GetFiles();    //有关目录下的文件   
                for (int i2 = 0; i2 < fis2.Length; i2++)
                {
     
                    al.Add(fis2[i2].FullName + "\t\t" + (float)(fis2[i2].Length / 1048576.00) + "MB");
                    //fis2[i2].FullName是根目录中文件的绝对地址,把它记录在ArrayList中
                }
            }
            for (int i = 0; i < diA.Length; i++)
            {
                aaa++;
                string space = "";
                for (int j = 0; j < aaa; j++)
                {
                    space += "-";
                }
                al.Add(space + diA[i].FullName + "\t<目录>" );
     
                //diA[i].FullName是某个子目录的绝对地址,把它记录在ArrayList中
                DirectoryInfo di1 = new DirectoryInfo(diA[i].FullName);
                DirectoryInfo[] diA1 = di1.GetDirectories();
                FileInfo[] fis1 = di1.GetFiles();    //有关目录下的文件   
                for (int ii = 0; ii < fis1.Length; ii++)
                {
     
                    al.Add(space + fis1[ii].FullName);
                    //fis1[ii].FullName是某个子目录中文件的绝对地址,把它记录在ArrayList中
     
                }
     
                GetAllDirList(diA[i].FullName);
                //递归        
            }        
     
    调用:
            GetAllDirList(@"I:\Music");
            foreach (string item in al)
            {
                TextBox1.Text = TextBox1.Text + item + "\n";
            }
    输出:I:\Music\Evanescence - My Immortal.mp3.td 4.074219MB
    I:\Music\Evanescence - My Immortal.mp3.td.cfg 0.0007429123MB
    I:\Music\i only wanted.mp3 4.93077MB
    I:\Music\Mariah Carey - I Only Wanted.lrc 0.001274109MB
    I:\Music\Mariah Carey - Through The Rain.lrc 0.001670837MB
    I:\Music\through the rain.mp3 4.445235MB
    I:\Music\春到湘江.mp3 5.793924MB
    -I:\Music\笛子 <目录>1
    -I:\Music\笛子\塞上风情.wma
    -I:\Music\笛子\妆台秋思.mp3
    -I:\Music\笛子\妆台秋思(箫_钢琴).wma
    -I:\Music\笛子\山居秋暝.wma
    -I:\Music\笛子\春到湘江.mp3
    -I:\Music\笛子\枣园春色.wma
    -I:\Music\笛子\欢乐的边疆.wma
    -I:\Music\笛子\登幽州台歌.wma
    -I:\Music\笛子\跑旱船.wma
    -I:\Music\笛子\远韵.wma
    -I:\Music\笛子\陕北好.wma
    --I:\Music\笛子\新建文件夹 <目录>1
    --I:\Music\笛子\新建文件夹\春到湘江.mp3
    --I:\Music\笛子\新建文件夹\欢乐的边疆.wma
    --I:\Music\笛子\新建文件夹\登幽州台歌.wma
    ---I:\Music\笛子\新建文件夹\adsfasdafa <目录>1
    ---I:\Music\笛子\新建文件夹\adsfasdafa\新建日志文档.jnt
    ----I:\Music\笛子\新建文件夹\adsfasdafa\新建文件夹 <目录>1
    ----I:\Music\笛子\新建文件夹\adsfasdafa\新建文件夹\新建 Microsoft Office Excel 工作表.xlsx
    -----I:\Music\苏打绿 <目录>1
    -----I:\Music\苏打绿\01.游乐.mp3
    -----I:\Music\苏打绿\02.花茶.mp3
    -----I:\Music\苏打绿\03.四季狂想.mp3
    -----I:\Music\苏打绿\04.左边.mp3
    -----I:\Music\苏打绿\05.无与伦比的美丽.mp3
    -----I:\Music\苏打绿\06.白日出没的月球.mp3
    -----I:\Music\苏打绿\07.这天.mp3
    -----I:\Music\苏打绿\08.简单生活.mp3
    -----I:\Music\苏打绿\09.城市.mp3
    -----I:\Music\苏打绿\10.相信.mp3
    -----I:\Music\苏打绿\苏打绿 - 四季狂想.lrc
    -----I:\Music\苏打绿\苏打绿 - 游乐.lrc
    -----I:\Music\苏打绿\苏打绿 - 相信.lrc
    -----I:\Music\苏打绿\苏打绿 - 花茶.lrc
      

  3.   

    现在不用遍历FTP了,遍历本地目录就行了,我用以下代码想得到有结构的文件列表但是输出不对,请大家帮忙看看。 public ArrayList al = new ArrayList();
        public int aaa = 0;
        public void GetAllDirList(string strBaseDir)
        {
     
            DirectoryInfo di = new DirectoryInfo(strBaseDir);
            DirectoryInfo[] diA = di.GetDirectories();
            if (aaa == 0)
            {
                FileInfo[] fis2 = di.GetFiles();    //有关目录下的文件   
                for (int i2 = 0; i2 < fis2.Length; i2++)
                {
     
                    al.Add(fis2[i2].FullName + "\t\t" + (float)(fis2[i2].Length / 1048576.00) + "MB");
                    //fis2[i2].FullName是根目录中文件的绝对地址,把它记录在ArrayList中
                }
            }
            for (int i = 0; i < diA.Length; i++)
            {
                aaa++;
                string space = "";
                for (int j = 0; j < aaa; j++)
                {
                    space += "-";
                }
                al.Add(space + diA[i].FullName + "\t<目录>" );
     
                //diA[i].FullName是某个子目录的绝对地址,把它记录在ArrayList中
                DirectoryInfo di1 = new DirectoryInfo(diA[i].FullName);
                DirectoryInfo[] diA1 = di1.GetDirectories();
                FileInfo[] fis1 = di1.GetFiles();    //有关目录下的文件   
                for (int ii = 0; ii < fis1.Length; ii++)
                {
     
                    al.Add(space + fis1[ii].FullName);
                    //fis1[ii].FullName是某个子目录中文件的绝对地址,把它记录在ArrayList中
     
                }
     
                GetAllDirList(diA[i].FullName);
                //递归        
            }        
     
    调用:
            GetAllDirList(@"I:\Music");
            foreach (string item in al)
            {
                TextBox1.Text = TextBox1.Text + item + "\n";
            }
    输出:I:\Music\Evanescence - My Immortal.mp3.td 4.074219MB
    I:\Music\Evanescence - My Immortal.mp3.td.cfg 0.0007429123MB
    I:\Music\i only wanted.mp3 4.93077MB
    I:\Music\Mariah Carey - I Only Wanted.lrc 0.001274109MB
    I:\Music\Mariah Carey - Through The Rain.lrc 0.001670837MB
    I:\Music\through the rain.mp3 4.445235MB
    I:\Music\春到湘江.mp3 5.793924MB
    -I:\Music\笛子 <目录>1
    -I:\Music\笛子\塞上风情.wma
    -I:\Music\笛子\妆台秋思.mp3
    -I:\Music\笛子\妆台秋思(箫_钢琴).wma
    -I:\Music\笛子\山居秋暝.wma
    -I:\Music\笛子\春到湘江.mp3
    -I:\Music\笛子\枣园春色.wma
    -I:\Music\笛子\欢乐的边疆.wma
    -I:\Music\笛子\登幽州台歌.wma
    -I:\Music\笛子\跑旱船.wma
    -I:\Music\笛子\远韵.wma
    -I:\Music\笛子\陕北好.wma
    --I:\Music\笛子\新建文件夹 <目录>1
    --I:\Music\笛子\新建文件夹\春到湘江.mp3
    --I:\Music\笛子\新建文件夹\欢乐的边疆.wma
    --I:\Music\笛子\新建文件夹\登幽州台歌.wma
    ---I:\Music\笛子\新建文件夹\adsfasdafa <目录>1
    ---I:\Music\笛子\新建文件夹\adsfasdafa\新建日志文档.jnt
    ----I:\Music\笛子\新建文件夹\adsfasdafa\新建文件夹 <目录>1
    ----I:\Music\笛子\新建文件夹\adsfasdafa\新建文件夹\新建 Microsoft Office Excel 工作表.xlsx
    -----I:\Music\苏打绿 <目录>1
    -----I:\Music\苏打绿\01.游乐.mp3
    -----I:\Music\苏打绿\02.花茶.mp3
    -----I:\Music\苏打绿\03.四季狂想.mp3
    -----I:\Music\苏打绿\04.左边.mp3
    -----I:\Music\苏打绿\05.无与伦比的美丽.mp3
    -----I:\Music\苏打绿\06.白日出没的月球.mp3
    -----I:\Music\苏打绿\07.这天.mp3
    -----I:\Music\苏打绿\08.简单生活.mp3
    -----I:\Music\苏打绿\09.城市.mp3
    -----I:\Music\苏打绿\10.相信.mp3
    -----I:\Music\苏打绿\苏打绿 - 四季狂想.lrc
    -----I:\Music\苏打绿\苏打绿 - 游乐.lrc
    -----I:\Music\苏打绿\苏打绿 - 相信.lrc
    -----I:\Music\苏打绿\苏打绿 - 花茶.lrc
      

  4.   

    如果你已经将当前ftp服务器建立并运行,
    可以编写ftp的客户端程序,发送获取目录信息指令即可获得服务器目录及子目录信息。
            public void GetCurDirInfo(String CurDirPath)
            {
                FileList = new List<FileOrDirInfo>();
                String msg;
                string tmp2 = DoCommand("PASV");
                SetInf(tmp2);
                IsCmdPasvSuccess = true;
                if (tmp2.Substring(0,1)!="2")//Type set to I.
                {
                    SetInf("服务器没有返回227,无法知道端口,也无法开始传输目录信息!");
                    IsCmdPasvSuccess = false;
                    return ;
                }
                string[] ips = Ftp.GetIP(tmp2);
                TcpClient tcm;
                try
                {
                    SetInf("正在连接文件传输服务器!");
                    tcm = new TcpClient(ips[0], System.Convert.ToInt32(ips[1]));//连接传输服务器.
                }
                catch (ArgumentNullException ex1)
                {
                    SetInf(ex1.Message);
                    return ;
                }
                catch (ArgumentOutOfRangeException ex2)
                {
                    SetInf(ex2.Message);
                    return ;
                }
                catch (SocketException ex3)
                {
                    SetInf(ex3.Message);
                    return ;
                }
                DoCmd("NOOP", "200");
                string inf = DoCommand("LIST "+CurDirPath);
                NetworkStream tmx = tcm.GetStream();//获得流
                SetInf("正在接收目录信息....");
                int i = 0;
                int c = 0;
                StringBuilder ReceDataBuilder=new StringBuilder();
                msg = "";
                do
                {                byte[] dats = new byte[10240];
                    i = tmx.Read(dats, 0, dats.Length);
                    c += i;
                   // Thread.Sleep(100);
                    ReceDataBuilder.AppendFormat("{0}", Encoding.Default.GetString(dats, 0, i));
                   // Thread.Sleep(100);
                              
                }
                while (i > 0);
                msg = ReceDataBuilder.ToString();
                tmx = null;
                tcm.Close();
                FileListStyle _directoryListStyle = Ftp.GuessFileListStyle(msg);
                String[] RecordList = msg.Split('\n');
                foreach(String rec in RecordList)
                {
                    if (_directoryListStyle != FileListStyle.Unknown && !String.IsNullOrEmpty(rec))
                    {
                        FileOrDirInfo Info = new FileOrDirInfo();
                        switch(_directoryListStyle)
                        {
                            case FileListStyle.WindowsStyle:
                                Info = Ftp.ParseFileStructFromWindowsStyleRecord(rec);
                                break;
                            case FileListStyle.UnixStyle:
                                Info = Ftp.ParseFileStructFromUnixStyleRecord(rec);
                                break;
                            case FileListStyle.Unknown:
                                break;
                            default:
                                break;
                        }
                        FileList.Add(Info);
                    }
                }
                msg = DoCommand("");
                if (msg.Substring(0, 1) == "2")
                {
                    inf = "接收目录信息完成!";
                    SetInf(inf);
                }
            }        /// <summary>
            /// 判断文件列表的方式Window方式还是Unix方式
            /// </summary>
            /// <param name="recordList">文件信息列表</param>
            private static FileListStyle GuessFileListStyle(String msg)
            {
                String[] RecordList = msg.Split('\n') ;            foreach (string s in RecordList)
                {
                    if (s.Length > 10
                     && Regex.IsMatch(s.Substring(0, 10), "(-|d)(-|r)(-|w)(-|x)(-|r)(-|w)(-|x)(-|r)(-|w)(-|x)"))
                    {
                        return FileListStyle.UnixStyle;
                    }
                    else if (s.Length > 8
                     && Regex.IsMatch(s.Substring(0, 8), "[0-9][0-9]-[0-9][0-9]-[0-9][0-9]"))
                    {
                        return FileListStyle.WindowsStyle;
                    }
                }
                return FileListStyle.Unknown;
            }