检查现有文件

时间:2012-04-18 13:19:10

标签: c# arrays file for-loop io

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

这是为了制作一个按随机顺序排列的图像列表,但没有公开。

到目前为止我得到的是

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 + "\" />";
            }
        }
    }

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

5 个答案:

答案 0 :(得分:3)

首先,摆脱NumberOfImages,因为它毫无意义。 整个foreach循环是可怕的,因为你在不需要它的集合中进行迭代。

其次,您可以使用FileInfo的Extension属性来检查文件的扩展字符串 - 不需要子字符串等。

第三,你到底想要做什么?

你确实意识到你可能会在循环结束时得到随机副本,因为你没有从集合中删除用过的图像。

最后,您不需要检查文件是否存在,因为您是从返回存在的文件的函数中获取的。

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);
    }
}

答案 1 :(得分: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;
 }

答案 2 :(得分:0)

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

从pb_adias中提取文本后,

使用Contains()Regex匹配。

答案 3 :(得分:0)

您可以列出文件名。

每次分配文件名时,检查它是否在列表中,如果没有将其添加到列表中,如果存在则查找其他文件。

答案 4 :(得分: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 + "\" />"; 

}