【问题标题】:Check for existing file检查现有文件
【发布时间】:2012-04-18 13:19:10
【问题描述】:

我需要一种方法来检查图片是否已经在 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 + "\" />";
            }
        }
    }

希望大家帮帮忙,我有点坑^^

【问题讨论】:

  • 为什么找文件的过程是随机的?
  • 因为我不希望图片每次都以相同的顺序排列
  • 不清楚,你在哪里检查文件?
  • 注意:你使用循环来计算图像的数量 - 你可以得到它GetFiles.Length
  • 可以在调用此方法之前假定lbl_Dias.Text 不包含文件名吗?

标签: c# arrays file for-loop io


【解决方案1】:

首先,摆脱 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);
    }
}

【讨论】:

    【解决方案2】:

    我想你只是想以随机顺序列出文件:

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

    【讨论】:

    • 你为 StringBuilder 使用 System.something 吗?
    • @MichaelTotKorsgaard 这是System.Text.StringBuilder 或者您可以将using System.Text; 放在文件顶部。当你有一个像这样的未知项目时,用鼠标悬停在它上面,Visual Studio 通常可以帮助你修复它。
    • 使用 GetFileName 来获取文件类型,而不是 GetFilesWithoutExtension 不是更好吗?
    • @MichaelTotKorsgaard 是的,这更有意义。
    【解决方案3】:

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

    从 lbl_Dias 中提取文本后使用 Contains() 或 Regex 匹配。

    【讨论】:

      【解决方案4】:

      您可以制作文件名列表。

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

      【讨论】:

        【解决方案5】:

        要验证某些内容不在您的标签文本中,请拥有相应的字典并在将其添加到标签之前进行检查,例如

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

        【讨论】:

          猜你喜欢
          • 2018-01-12
          • 1970-01-01
          • 2020-07-25
          • 2013-01-25
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-10-16
          • 1970-01-01
          相关资源
          最近更新 更多