none
【C#】请问C#如何遍历某文件夹下的所有文件? RRS feed

  • 问题

  • 有个文件夹下放的都是图片,请问高手用什么方法可以遍历出这些图片名?

    刚才依照大侠的方法确实好用,但在项目中存在问题;不知道怎么回事?

    在后台调用FoundFile方法,代码如下:

        protected void Page_Load(object sender, EventArgs e)
        {
            if (!IsPostBack)
            {
                FoundFile();

            }
        }

        public string FoundFile()
        {
            try
            {
                DirectoryInfo di = new DirectoryInfo(Server.MapPath("~/uploads/"));
                foreach (FileInfo fi in di.GetFiles())
                {
                    return fi.Name;    //fi.Name就是每个文件的名字!
                }
            }
            catch
            {
                throw new FileNotFoundException("没有找到你所删除的文件,请重新再试!");
            }
        }

    前台在DataList中绑定图片地址,代码如下:

    <asp:datalist id="DataList1" runat="server" RepeatDirection="Horizontal" RepeatColumns="4" Width="100%" >
              <ItemTemplate>
               
                <table  cellspacing="1" cellpadding="1" width="100%" border="0">
                 <tr>
                  <td align="center" >
                   <asp:Image id=img runat="server" Height="100px" Width="134px" BorderWidth="0" ImageUrl='<%=FoundFile().ToString() %>' >
                   </asp:Image>
                   </td>
                 </tr>
                </table>
               
              </ItemTemplate>
             </asp:datalist>

    提出错误:Default.FoundFile()”: 并非所有的代码路径都返回值 E:\YuCheng\Default.aspx.cs 24 19 E:\YuCheng\
    说FoundFile()方法有误,请问高手这是怎么回事?应该如何解决!谢谢。

    2009年12月22日 2:59

答案

  • 问题搞定,上述代码修改如下:
    public void FoundFile()
        { DirectoryInfo di = new DirectoryInfo(Server.MapPath("~/uploads/"));
            DataTable dt = new DataTable();
            dt.Columns.Add("imgurl", typeof(String));
            foreach (FileInfo fi in di.GetFiles())
            {
                DataRow dr = dt.NewRow();
                dr[0] = Server.MapPath("uploads/")+fi.Name;
                dt.Rows.Add(dr);
               
            }

            this.DataList1.DataSource = dt;
            this.DataList1.DataBind();
    }

    结贴吧,谢谢两位高手的帮助。如过再把第一种解决不出来的方法解决了,就更完美了。

    • 已标记为答案 jinwb1982 2009年12月24日 4:58
    2009年12月22日 15:01

全部回复

  • 有个文件夹下放的都是图片,请问高手用什么方法可以遍历出这些图片名?
    2009年12月22日 2:55
  • 你好!
         可以这样来实现:
                DirectoryInfo di = new DirectoryInfo(@"D:\工作日志");
                foreach (FileInfo fi in di.GetFiles())
                    Console.WriteLine(fi.Name);    //fi.Name就是每个文件的名字!
    周雪峰
    2009年12月22日 3:17
    版主
  • 你好,使用 Directory.GetFiles(string path)  或 Directory.GetFiles(string path, string searchPattern) 
    知识改变命运,奋斗成就人生!
    2009年12月22日 3:17
    版主
  • 你好!
         我已经在另外一个同样的帖子中回复了这个问题!
         请不要重复发帖啊!多谢你的理解和支持!
    周雪峰
    2009年12月22日 3:17
    版主
  • 知道了,刚才是网络延时造成的
    2009年12月22日 3:25
  • 有个文件夹下放的都是图片,请问高手用什么方法可以遍历出这些图片名?

    刚才依照大侠的方法确实好用,但在项目中存在问题;不知道怎么回事?

    在后台调用FoundFile方法,代码如下:

        protected void Page_Load(object sender, EventArgs e)
        {
            if (!IsPostBack)
            {
                FoundFile();

            }
        }

        public string FoundFile()
        {
            try
            {
                DirectoryInfo di = new DirectoryInfo(Server.MapPath("~/uploads/"));
                foreach (FileInfo fi in di.GetFiles())
                {
                    return fi.Name;    //fi.Name就是每个文件的名字!
                }
            }
            catch
            {
                throw new FileNotFoundException("没有找到你所删除的文件,请重新再试!");
            }
        }

    前台在DataList中绑定图片地址,代码如下:

    <asp:datalist id="DataList1" runat="server" RepeatDirection="Horizontal" RepeatColumns="4" Width="100%" >
              <ItemTemplate>
               
                <table  cellspacing="1" cellpadding="1" width="100%" border="0">
                 <tr>
                  <td align="center" >
                   <asp:Image id=img runat="server" Height="100px" Width="134px" BorderWidth="0" ImageUrl='<%=FoundFile().ToString() %>' >
                   </asp:Image>
                   </td>
                 </tr>
                </table>
               
              </ItemTemplate>
             </asp:datalist>

    提出错误:Default.FoundFile()”: 并非所有的代码路径都返回值 E:\YuCheng\Default.aspx.cs 24 19 E:\YuCheng\
    说FoundFile()方法有误,请问高手这是怎么回事?应该如何解决!谢谢。

    2009年12月22日 4:32
  • 你好!
         可以这样来实现:
    public string[] FoundFile()
            {

                try
                {
                    DirectoryInfo di = new DirectoryInfo(Server.MapPath("~/uploads/") );
                    int index = 0;
                    string[] result = new string[di.GetFiles().Length];

                    foreach (FileInfo fi in di.GetFiles())
                    {
                        result[index++]=fi.Name;    //fi.Name就是每个文件的名字!
                    }
                    return result;
                }
                catch
                {

                    throw new FileNotFoundException("没有找到你所删除的文件,请重新再试!");
                }
            }
    周雪峰
    2009年12月22日 5:01
    版主
  • 你好,依照你的方法编译通过,但运行的时候发现DataList没有显示数据,我感觉是Datalist没有绑定的缘故;于是修改代码为:

        public string[] FoundFile()
        {

            try
            {
                DirectoryInfo di = new DirectoryInfo(Server.MapPath("~/uploads/"));
                int index = 0;
                string[] result = new string[di.GetFiles().Length];

                foreach (FileInfo fi in di.GetFiles())
                {
                    result[index++] = fi.Name;    //fi.Name就是每个文件的名字!
                    return result;
                }
                this.DataList1.DataSource = result;
                this.DataList1.DataBind();
               
            }
            catch
            {

                throw new FileNotFoundException("没有找到你所删除的文件,请重新再试!");
            }
        }

    }

    这样反而出现问题。提示:“_Default.FoundFile()”: 并非所有的代码路径都返回值

    请这位高手帮小弟解决一下,在下表示不胜感激!

    2009年12月22日 5:13
  • <%@ Page Language="C#" AutoEventWireup="true" %>
    <%@ Import Namespace="System.Data" %>
    <%@ Import Namespace="System.IO" %>
    <script runat="server">
        protected void Page_Load(object sender, EventArgs e)
        {
            if (!IsPostBack)
                this.BindDataList();
        }
    
        private void BindDataList()
        {
            DataTable dt = new DataTable();
    
            dt.Columns.Add("PhysicalPath", typeof(String));
            dt.Columns.Add("url", typeof(String));
    
            foreach (string fileName in Directory.GetFiles(Server.MapPath("~/uploads/")))
                dt.Rows.Add(new object[] { fileName, this.GetUrl(fileName) });
    
            this.DataList1.DataSource = dt;
            this.DataList1.DataBind();
        }
    
        public String UrlPrefix;
        
        /// <summary>
        /// 拼接 URL
        /// </summary>
        /// <param name="filePath"></param>
        /// <returns></returns>
        public String GetUrl(String filePath)
        {
            if (String.IsNullOrEmpty(UrlPrefix))
                UrlPrefix = String.Format("http://{0}/uploads/", Request.Url.Authority);
            string fileName = Path.GetFileName(filePath);
            string url = this.UrlPrefix + fileName;
    
            return url;
        }
    </script>
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml" >
    <head runat="server">
        <title>示例:显示某一文件夹下的图片</title>
    </head>
    <body>
        <form id="form1" runat="server">
        <div>
        <asp:datalist id="DataList1" runat="server" Width="100%" >
            <ItemTemplate>
                <table  cellspacing="1" cellpadding="1" width="100%" border="0">
                    <tr>
                        <td><%#Eval("PhysicalPath")%></td>
                        <td>
                            <asp:Image ImageUrl='<%#Eval("Url")%>' runat="server" >
                            </asp:Image>
                        </td>
                    </tr>
                </table>
            </ItemTemplate>
        </asp:datalist>
        </div>
        </form>
    </body>
    </html>

    知识改变命运,奋斗成就人生!
    2009年12月22日 5:38
    版主
  • 这样修改一下,不要返回值了:

        public void FoundFile()
        {

            try
            {
                DirectoryInfo di = new DirectoryInfo(Server.MapPath("~/uploads/"));
                int index = 0;
                string[] result = new string[di.GetFiles().Length];

                foreach (FileInfo fi in di.GetFiles())
                {
                    result[index++] = fi.Name;    //fi.Name就是每个文件的名字!
                   
                }
                this.DataList1.DataSource = result;
                this.DataList1.DataBind();
               
            }
    周雪峰
    2009年12月22日 6:47
    版主
  • 不好意思版主,我回复稍微晚了点。你这个方法我也试过,运行没有问题,但是图片没有显示出来,查看源代码是<input type="image" name="DataList1$ctl00$del" id="DataList1_ctl00_del" src="" style="border-width:0px;" />

    图片点击右键查看属性http://localhost:14222/YuCheng/<%=FoundFile()%> 似乎FoundFile()方法没有解析出来。

    之后我换了一个方法把前台绑定语句ImageUrl='<%=FoundFile()%>'去掉,后台改成:
    try
            {
                DirectoryInfo di = new DirectoryInfo(Server.MapPath("~/uploads/"));
                int index = 0;
                string[] result = new string[di.GetFiles().Length];

                foreach (FileInfo fi in di.GetFiles())
                {
                    result[index++] = fi.Name;    //fi.Name就是每个文件的名字!
                    //return result;
                    ((System.Web.UI.WebControls.Image)this.DataList1.FindControl("img")).ImageUrl = result[index++].ToString();
                    this.DataList1.DataSource = result[index++];
                    this.DataList1.DataBind();

                }
                
                                
            }
            catch
            {

                throw new FileNotFoundException("没有找到你所删除的文件,请重新再试!");
            }
        }

    运行时出错 :

    没有找到你所删除的文件,请重新再试!

    说明: 执行当前 Web 请求期间,出现未处理的异常。请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息。

    异常详细信息: System.IO.FileNotFoundException: 没有找到你所删除的文件,请重新再试!

    源错误:

    行 45:         {
    行 46: 
    行 47:             throw new FileNotFoundException("没有找到你所删除的文件,请重新再试!");
    行 48:         }
    行 49:     }

    似乎产生了一场,程序跟踪一下发现,走到foreach (FileInfo fi in di.GetFiles()) 第二次遍历的时候发生异常,查看文件夹里的图片有确实存在。始终找不到问题所在,望请斑竹帮助,期待您的回复,谢谢!

    2009年12月22日 9:03
  • 你好!
         你把这个去掉:
            catch
            {             throw new FileNotFoundException("没有找到你所删除的文件,请重新再试!");
            }
        try语句也去掉!

        然后看看抛出什么异常?你上面的语句掩盖了事实真相!
    周雪峰
    2009年12月22日 9:33
    版主
  • 错误提示索引超出了数组界限。但哪里超出界限呢?奇怪

    2009年12月22日 9:36
  • 你好!
         这里有问题:
    this.DataList1.DataSource = result[index++];
    你改成this.DataList1.DataSource = result;
    周雪峰
    2009年12月22日 9:41
    版主
  • 我目前用的就是this.DataList1.DataSource = result; 和之前一样,网页可以运行,但图片显示不了,查看源代码src=""没有值。怀疑还是绑定有问题吧
    2009年12月22日 9:43
  • 你好,你的方法我有考虑过,试验中也确实好用,我想请问一下,最后发现图片路径有问题。怎样在URL中加上应用程序名?

    2009年12月22日 10:39
  • 是绑定的问题!默认是绑定到数组元素的第一个属性的!
    你把数组做一下二次包装:
        public class Item
        {
            private string text = "";
            public Item(string text)
            {

                this.text = text;
            }
            public string Text
            {
                get
                {
                    return text;
                }
                set
                {
                    text = value;
                }
            }
        }

    public void FoundFile()
            {

                try
                {
                    DirectoryInfo di = new DirectoryInfo(Server.MapPath("~/uploads/") );
                    int index = 0;
                    Item[] result = new Item[di.GetFiles().Length];

                    foreach (FileInfo fi in di.GetFiles())
                    {
                        result[index++]=new Item(fi.Name);    //fi.Name就是每个文件的名字!
                    }
                this.DataList1.DataSource = result;
                this.DataList1.DataBind();
                   
                }
                catch
                {

                    throw new FileNotFoundException("没有找到你所删除的文件,请重新再试!");
                }
            }

    周雪峰
    2009年12月22日 11:16
    版主
  • 斑竹还是不行,你的代码我测试了,不好用。代码如下;
    public partial class _Default : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            if (!IsPostBack)
            {
                FoundFile();

            }
        }

        public void FoundFile()
        {

            try
            {
                DirectoryInfo di = new DirectoryInfo(Server.MapPath("~/uploads/"));
                int index = 0;
                Item[] result = new Item[di.GetFiles().Length];

                foreach (FileInfo fi in di.GetFiles())
                {
                    result[index++] = new Item(fi.Name);    //fi.Name就是每个文件的名字!
                    this.DataList1.DataSource = result;
                }
               
                this.DataList1.DataBind();

            }
            catch
            {

                throw new FileNotFoundException("没有找到你所删除的文件,请重新再试!");
            }

     


        }

     


    }


    public class Item
    {
        private string text = "";
        public Item(string text)
        {

            this.text = text;
        }
        public string Text
        {
            get
            {
                return text;
            }
            set
            {
                text = value;
            }
        }
    }

    运行后网页能运行,但还是显示不出图片来。到目前为止X.X.Y朋友的方法是可行的,并且我做了一下改动。可以实现我想达到的效果。
    代码:
    public void FoundFile()
        {

            //try
            //{
                // DirectoryInfo di = new DirectoryInfo(Server.MapPath("~/uploads/"));
                //int index = 0;
                //string[] result = new string[di.GetFiles().Length];

                //foreach (FileInfo fi in di.GetFiles())
                //{
                //    result[index++] = fi.Name;    //fi.Name就是每个文件的名字!
                //    return result;
                //    //((System.Web.UI.WebControls.Image)this.DataList1.FindControl("img")).ImageUrl = result[index++].ToString();
                //    this.DataList1.DataSource = result;

                //}
               
                //this.DataList1.DataBind();
                   
               
            //}
            //catch
            //{

            //    throw new FileNotFoundException("没有找到你所删除的文件,请重新再试!");
            //}

            DataTable dt = new DataTable();

            dt.Columns.Add("PhysicalPath", typeof(String));
            dt.Columns.Add("url", typeof(String));

            foreach (string fileName in Directory.GetFiles(Server.MapPath("~/uploads/")))
                dt.Rows.Add(new object[] { fileName, this.GetUrl(fileName) });

            this.DataList1.DataSource = dt;
            this.DataList1.DataBind();
        }

        public string UrlPrefix;
        public string url;
        /// <summary>
        /// 拼接 URL
        /// </summary>
        /// <param name="filePath"></param>
        /// <returns></returns>
        public string GetUrl(string filePath)
        {
           
            if (String.IsNullOrEmpty(UrlPrefix))
            {
                //UrlPrefix = String.Format("http://{0}/uploads/", Request.Url.Authority);
                string fileName = Path.GetFileName(filePath);
                 url = Server.MapPath("uploads/") + fileName;
               
            }
            return url;
        }

    这块我还的修改一下。不过斑竹提到的方法我也想知道,应该如何解决呢?

    <abbr class="affil" />
    2009年12月22日 14:13
  • 问题搞定,上述代码修改如下:
    public void FoundFile()
        { DirectoryInfo di = new DirectoryInfo(Server.MapPath("~/uploads/"));
            DataTable dt = new DataTable();
            dt.Columns.Add("imgurl", typeof(String));
            foreach (FileInfo fi in di.GetFiles())
            {
                DataRow dr = dt.NewRow();
                dr[0] = Server.MapPath("uploads/")+fi.Name;
                dt.Rows.Add(dr);
               
            }

            this.DataList1.DataSource = dt;
            this.DataList1.DataBind();
    }

    结贴吧,谢谢两位高手的帮助。如过再把第一种解决不出来的方法解决了,就更完美了。

    • 已标记为答案 jinwb1982 2009年12月24日 4:58
    2009年12月22日 15:01