今天遇到个怪问题,上传几个文件的时候是这样用的,
// 获取所有文件
HttpFileCollection allFiles = request.Files;
想这样使用
foreach (HttpPostedFile file in allFiles) {
     // 但是这里报错,说字符串不能转成HttpPostedFile
}
但是这样不行,虽然知道了不行了,但是很想知道到底在什么情况下才能使用foreach,请各位高手在这里讲解一下,谢谢!

解决方案 »

  1.   

    HttpFileCollection allFiles = Request.Files; 
    想这样使用 
    foreach (HttpPostedFile file in allFiles) { 这样是没有问题的你的“// 但是这里报错,说字符串不能转成HttpPostedFile ”
    代码是什么?
      

  2.   

    foreach (HttpPostedFile file in allFiles) { 这一行报错了
      

  3.   

    foreach (HttpPostedFile file in allFiles) { 
        // 但是这里报错,说字符串不能转成HttpPostedFile 

    应该是你循环里的代码有错,是不是把file 赋值给一个字符串变量了?foreach (HttpPostedFile file in allFiles) 这是没错的,仔细检查下代码
      

  4.   

    学.NET来第一次遇到这种问题,因为见过它可以以数组形式方访问,所以就想试试foreach,结果试出问题了
      

  5.   

    实现了IEnumerable和IEnumerator两个接口的数据结构都可以用foreach遍历
      

  6.   

    foreach 应用于Collection,List<T>等的遍历
      

  7.   

    谢谢楼上的回复!
    查过了,确实是那个地方出问题了,如果改成
    无法将类型为“System.String”的对象强制转换为类型“System.Web.HttpPostedFile”。
    完整代码 
       public static string[] PutFileToFolder(HttpRequest request)
        {
            // 设置文件存放路径
            string folderPath = HttpContext.Current.Server.MapPath(string.Format("~/{0}/{1}/", STORE_FILE_PATH, DateTime.Now.ToString("yyyyMM")));        // 文件不存在
            if (System.IO.Directory.Exists(folderPath) == false)
                System.IO.Directory.CreateDirectory(folderPath);        // 文件存放数组
            ArrayList filelist = new ArrayList();        // 获取所有文件
            HttpFileCollection allFiles = request.Files;
            for (int i = 0; i < allFiles.Count; i++)  // 这里不出错
            { 
                
            }
            foreach (HttpPostedFile myfiles in allFiles) { // 这里出错
                
            }
            ////STORE_FILE_PATH
            //string filePath = string.Empty;
            //string fileExt = string.Empty;
            //for (int i = 0; i < allFiles.Count; i++)
            //{
            //    HttpPostedFile file = allFiles[i];        //    // 空文件
            //    if (file.ContentLength == 0) continue;
            //    fileExt = System.IO.Path.GetExtension(file.FileName);        //    // 设置文件路径,名字,后缀
            //    filePath = string.Format("{0}{1}{2}", folderPath, DateTime.Now.Ticks.ToString(), fileExt);        //    // 保存文件
            //    file.SaveAs(filePath);        //    // 将路径加入列表
            //    filelist.Add(filePath);
            //}
            return new string[] { };
        }
      

  8.   

    可以使用For
    HttpPostedFile file = allFiles[i];
      

  9.   

    IEnumerable这个已经被实现了,但是还是不能遍历,不知道是什么原因!高手解答
      

  10.   

    在我这边
    HttpRequest req = this.Request;
    HttpFileCollection allFiles = req.Files;
    foreach (HttpPostedFile file in allFiles)
    {
    }
    没有任何问题,不知道楼主问题出在哪。
      

  11.   

    看MSDN上的一段话:
    In C#, it is not strictly necessary for a collection class to inherit from IEnumerable and IEnumerator in order to be compatible with foreach; as long as the class has the required GetEnumerator, MoveNext, Reset, and Current members, it will work with foreach. 
    只要类实现了GetEnumerator, MoveNext, Reset, Current四个方法和属性就可以了,不一定说要实现IEnumerable 和IEnumerator 接口。而
    HttpFileCollection 反射出来的结果为下面的内容
    public sealed class HttpFileCollection : NameObjectCollectionBase
    {......}
    而NameObjectCollectionBase实现了ICollection, IEnumerable, ISerializable, IDeserializationCallback实现了四个接口,显然这符合foreach的要求.......
    说类型不对,是因为Current属性的类型无法转换为要求的类型,你可以试试把string换成HttpPostedFile看看,我看应该可以了。
      

  12.   

    我的.net环境是2.0,不知道是不是版本不合的原因。我这边是出问题了。呵呵!
      

  13.   

    现在的场合很简单了,我改了代码
    前台aspx
            <div id="divFilesPanel">
                <ul>
                <li><asp:FileUpload ID="myfile" runat="server" /></li>
                </ul>
                <div><input type="button" id="addUploadFile" value="添加上传控件" /> <asp:Button ID="btnUploadFile" runat="server" Text="开始上传" OnClick="btnUploadFile_Click" /></div>
            </div>后台cs
        protected void btnUploadFile_Click(object sender, EventArgs e)
        {
            foreach (HttpPostedFile file in Request.Files)// 无法将类型为“System.String”的对象强制转换为类型“System.Web.HttpPostedFile”。
            { }
            // WebUtility.PutFileToFolder(Request);
        }
    还出那个问题!
      

  14.   

    无法将类型为“System.String”的对象强制转换为类型“System.Web.HttpPostedFile”。 我刚才试了一下也报这个错,                              for(int iFile = 0; iFile < files.Count; iFile++) 


    /**////'检查文件扩展名字 
    HttpPostedFile postedFile = files[iFile]; 
    用for循环就不会,晕
      

  15.   

    msdn:http://msdn.microsoft.com/en-us/library/ttw7t8t6.aspx
    The foreach statement repeats a group of embedded statements for each element in an array or an object collection that implements the System.Collections..::.IEnumerable or ......
    HttpFileCollection应该没有实现IEnumerable接口吧!
      

  16.   


    应该是实现了啊,youbl 他说他不报错...真的不知道是什么原因了
      

  17.   

    应该是没问题的,你可以断点调试到那一行看看file 和 allFiles都是什么类型的,是否有值
      

  18.   

    慢慢学习PS: 
    我的目标是 ----> ^_^
      

  19.   

    allfile肯定是有值的,而file,根本都下不了foreach,file肯定是什么都没有了!应该算是微软一个bug吧!(可能我真的无法解释这种现象了)
      

  20.   

    bug?只有人人都会出现的问题,才能称之为bug吧
    你把你的项目打包,发出来给我看看
    youbl@126.com
      

  21.   

    的确是不能foreach的,,大家可以看看 反编译 后的.net 2.0中的实现代码
      

  22.   

    HttpFileCollection 继承自 NameObjectCollectionBase,而 NameObjectCollectionBase 的 GetEnumerator() 返回 NameObjectKeysEnumerator,NameObjectKeysEnumerator 的 Current 属性返回的是 String 类型的 Key,所以当 foreach 时,Request.Files 确实是一个 String 类型集合,的确不能转换成 HttpPostedFile,而 HttpFileCollection 的 this[] 返回的确是 HttpPostedFile 类型。
    如果写成 
    foreach (string key in Request.Files)
    {
        HttpPostedFile file = Request.Files[key];
        或者
         HttpPostedFile file = Request.Files.Get(key);
        
        ...
    }
    就可以
    真是奇怪啊,不能理解,如有高手看到,还望给予讲解,谢谢
      

  23.   

    给大家一个 准确的回答,是因为Upload不是服务器端控件。 大家知道怎么回事了吧,说到底MS的Bug