【问题标题】:select random file from directory从目录中选择随机文件
【发布时间】:2009-04-13 00:15:09
【问题描述】:

我在 C# 中看到了一些示例,但到目前为止还没有,在目录下选择随机文件的最佳方法是什么?

在这种特殊情况下,我想每隔 15 分钟左右从“C:\wallpapers”中选择一张壁纸。

谢谢。

【问题讨论】:

    标签: c# .net file random


    【解决方案1】:

    获取一个数组中的所有文件,然后随机检索一个

    var rand = new Random();
    var files = Directory.GetFiles("c:\\wallpapers","*.jpg");
    return files[rand.Next(files.Length)];
    

    【讨论】:

    • 我试过这个代码 sn-p 并且它工作正常,但它只在文件夹壁纸中搜索,而不是在壁纸内搜索任何子文件夹。如何修改代码来做到这一点?
    • 考虑将 SearchOption.AllDirectories 作为第三个参数传递给 GetFiles 方法。
    【解决方案2】:

    如果您正在为壁纸执行此操作,您不想只是随机选择一个文件,因为它不会在用户看来是随机的。

    如果您连续 3 次选择同一个会怎样?还是两者交替?

    这是“随机的”,但用户不喜欢它。

    请参阅此帖子了解如何display random pictures in a way users will like

    【讨论】:

    • 在洗牌时,您可能还应该考虑文件被删除或添加到目录的情况(在这种情况下,您需要重新洗牌)。
    【解决方案3】:

    select random file from directory

    private string getrandomfile2(string path)
        {
            string file = null;
            if (!string.IsNullOrEmpty(path))
            {
                var extensions = new string[] { ".png", ".jpg", ".gif" };
                try
                {
                    var di = new DirectoryInfo(path);
                    var rgFiles = di.GetFiles("*.*").Where( f => extensions.Contains( f.Extension.ToLower()));
                    Random R = new Random();
                    file = rgFiles.ElementAt(R.Next(0,rgFiles.Count())).FullName;
                }
                // probably should only catch specific exceptions
                // throwable by the above methods.
                catch {}
            }
            return file;
        }
    

    【讨论】:

    • 捕获异常并默默地忽略它们是不好的。您应该要么处理异常并返回有用的东西,要么根本不捕获它们。
    【解决方案4】:
    var files = new DirectoryInfo(@"C:\dev").GetFiles();
    int index = new Random().Next(0, files.Length);
    
    Console.WriteLine(files[index].Name);
    

    【讨论】:

      【解决方案5】:

      为什么不只是:

      1. 将文件放入数组中
      2. 使用 Random 类选择一个介于 0 和 files.Length 之间的随机数
      3. 使用随机数作为索引从数组中抓取文件

      【讨论】:

        【解决方案6】:

        使用Directory.GetFiles(...) 获取文件名数组并使用Random 类选择随机文件。

        【讨论】:

          【解决方案7】:

          只需我的 5 美分,用于 mvc 操作的代码,使用 cookie,因此我们不会重复相同的文件名两次:

                  [AllowAnonymous]
                  //-------------------------------------------------------------
                  public async Task<ActionResult> RandomBackground()
                  //-------------------------------------------------------------
                  {
                      var basePath = "~/Content/images/backgrounds";
                      var dir = System.Web.Hosting.HostingEnvironment.MapPath(basePath);
          
                      var rand = new Random();
                      var files = System.IO.Directory.GetFiles(dir, "*.jpg");
                      if (files!=null)
                      {
                          var cookie = "Background";
                          var pickedFile = "";
                          var fileName = "";
                          var oldFilename = "";
                          while ((oldFilename == fileName) && files.Count<string>()>1)
                          {
                              oldFilename = ReadControllerCookie(cookie);
                              pickedFile = files[rand.Next(files.Length)];
                              fileName = System.IO.Path.GetFileName(pickedFile);
                          }
                          SaveControllerCookie(cookie, fileName);
                          return Content(fileName);
                      }
                      return new EmptyResult();
                  }
          

          用作:

          <img src="~/Content/images/backgrounds/@Html.Action("RandomBackground", "YourControllerName")">
          

          【讨论】:

            猜你喜欢
            • 2020-08-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2010-09-29
            • 1970-01-01
            • 2020-06-03
            • 1970-01-01
            相关资源
            最近更新 更多