2012-04-18 78 views
1

我需要一种方法来检查图片是否已经在lbl_Dias中。如果没有添加图片,则转到下一张图片。检查现有文件

这是为了使图像的列表是按随机顺序,但没有dublicates。

我该怎么到目前为止,这是

protected void DiasShow() 
    { 
     string[] getFiles = Directory.GetFiles(HttpContext.Current.Server.MapPath("/CSS/Design/Page_Design/Dias/1920x1080/")); 

     for (int i = 0; i <= GetFiles.Length; i++) 
     { 
      Random FindRandom = new Random(); 
      string RandomFileName = getFiles[FindRandom.Next(getFiles.Length)]; 

      FileInfo ImageName = new FileInfo(RandomFileName); 
      string FileType = ImageName.Name.Substring(ImageName.Name.Length - 4); 

      if ((FileType.ToUpper() == ".JPG") || (FileType.ToUpper() == "JPEG")) 
      { 
       lbl_Dias.Text += "<img src=\"CSS/Design/Page_Design/Dias/1920x1080/" + ImageName.Name + "\" />"; 
      } 
     } 
    } 

我希望你们能帮助,我有点股票^^

+0

为什么是要找到一个随机文件的过程? – OmegaMan 2012-04-18 13:23:55

+0

因为我不希望图片每次都以相同的顺序 – 2012-04-18 13:25:56

+0

不清楚,你在哪里检查文件? – 2012-04-18 13:26:17

回答

1

我相信你只是想列出一个随机顺序文件:

protected void DiasShow()  
{ 
    var getFiles = Directory.GetFiles(HttpContext.Current.Server.MapPath("/CSS/Design/Page_Design/Dias/1920x1080/")); //Find alle filer I en mappe  

    var random = RandomiseList(getFiles); 

    var txt = new StringBuilder(); 
    foreach (var randomFileName in random) 
    { 
     var fileType = System.IO.Path.GetExtension(randomFileName).ToUpper(); 

     if ((fileType == ".JPG") || (fileType == ".JPEG")) 
     { 
      var imageName = System.IO.Path.GetFileName(randomFileName); 
      txt.Append("<img src=\"CSS/Design/Page_Design/Dias/1920x1080/" + imageName+ "\" />"); 
     } 
    } 
    lbl_Dias.Text += txt.ToString(); 
} 

public static T[] RandomiseList<T>(T[] source) 
{ 
    var rand = new Random(); //no need for own seed 
    var list = new List<T>(source); //copy to a new list which we can remove from 
    var result = new T[source.Length]; 
    for (int i = 0; i < source.Length; i++) 
    { 
     var listIndex = rand.Next(list.Count()); 
     result[i]= list[listIndex]; 
     list.RemoveAt(listIndex); 
    } 
    return result; 
} 
+0

对StringBuilder使用System.something吗? – 2012-04-18 14:58:42

+0

@MichaelTotKorsgaard它是'System.Text.StringBuilder',或者你可以把'using System.Text;'放在文件的顶部。当你有一个像鼠标一样悬停的未知物品时,Visual Studio通常可以帮助你修复它。 – weston 2012-04-18 15:04:40

+0

而不是GetFilesWithoutExtension会不会更好使用GetFileName来获取文件的类型? – 2012-04-18 15:10:07

0

由于没有代码,你正在检查的文件,我假定你正在检查文件名。

使用Contains()或者从lbl_Dias提取出文本后Regex比赛。

0

您可以制作一个文件名列表。

每次分配一个文件名,你检查它是否在列表中,如果不将它添加到列表中,如果存在寻找一个不同的文件时,

0

为了验证自己是不是在你的标签的文本有一个相应的字典,它增加了标签前检查,如

Dictionary<string, int> _filenames = new Dictionary<string,int>(); 

.... 

if (_filenames.ContainsKey(ImageName.Name) == false) 
{ 
    _filenames.Add(ImageName.Name, 0); 

    lbl_Dias.Text += "<img src=\"CSS/Design/Page_Design/Dias/1920x1080/" + ImageName.Name + "\" />"; 

} 
3

首先,摆脱NumberOfImages,因为它毫无意义。 整个foreach循环很糟糕,因为您正在迭代不需要的集合。

其次,你可以使用的FileInfo的扩展属性来检查文件的扩展名字符串 - 无需子等

第三,究竟是你想在这里做什么?

你一定要明白,你可能会在循环结束得到随机重复,因为你没有从集合删除使用的图像。

最后,你不需要检查文件是否存在于所有的,因为你从返回文件存在的功能得到了它。

protected void DiasShow() 
{ 
    var mapPath = HttpContext.Current.Server.MapPath("/CSS/Design/Page_Design/Dias/1920x1080/"); 

    var images = 
     Directory.GetFiles(mapPath).Select(
      file => new FileInfo(file)).Where(fi => 
       fi.Extension.EndsWith("jpg", StringComparison.OrdinalIgnoreCase) || 
       fi.Extension.EndsWith("jpeg", StringComparison.OrdinalIgnoreCase)).ToList(); 

    var rand = new Random(); 

    while (images.Count > 0) 
    { 
     var i = rand.Next(images.Count); 
     lbl_Dias.Text += "<img src=\"CSS/Design/Page_Design/Dias/1920x1080/" + images[i].Name + "\"/>"; 
     images.RemoveAt(i); 
    } 
}