如何从指定目录中随机选择文件?

时间:2018-09-29 23:34:44

标签: .net vb.net

我正在制作一个程序,该程序从目录中随机选择一个文件(而不是文件夹),并生成一个带有该文件作为文本的消息框。我目前正在使用:

Imports System.IO
Public Class Form1
    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        For Each item In Directory.GetFiles("Directory")
            Dim filename As String = Path.GetFileName(item)
            MsgBox(filename)
        Next
    End Sub
End Class

但是,这会按照文件在该目录中的顺序(从上到下)打印文件。有什么方法可以随机模式从目录中打印文件?例如,如果目录具有文件F1F2F3。我使用的代码按F1F2F3的顺序打印出来。而我想要一个以随机顺序打印它们的程序,例如F2F1F3。另外,如果可能的话,我只希望程序输出一个文件名并停止,而不希望它不断遍历目录。例如,消息框将显示F2并关闭,而不是浏览文件列表。

2 个答案:

答案 0 :(得分:1)

您可以使用LINQ按随机数生成器生成的随机数排序。
由于LINQ的工作方式,它实际上将为每个条目生成一个随机数并将其缓存,然后按该数字排序。

确保为您的随机数生成器播种。

Public Class Form1
    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        Dim rand As New Random(System.DateTime.Now.Millisecond)
        For Each item In Directory.GetFiles("Directory").OrderBy(Function(x) rng.Next())
            Dim filename As String = Path.GetFileName(item)
            MsgBox(filename)
        Next
    End Sub
End Class

要仅获取第一个条目,您可以在MsgBox(filename)之后立即中断,或者您可以在随机序列中获取第一个条目...

Dim filename As String = Directory.GetFiles("Directory").OrderBy(Function(x) rng.Next()).First()
MsgBox(filename)

当心.First()将在没有文件的情况下引发异常。 .FirstOrDefault()不会引发异常,而是将字符串设置为null。如果需要此行为,可以在显示消息框之前检查是否为空。

答案 1 :(得分:1)

首先,创建Random(在子/事件处理程序之外)的共享实例:

Private Shared Rand As New Random()

然后,您可以使用类似(在您的子/事件处理程序内部)的内容:

Dim files As String() = Directory.GetFiles("C:\Test")
Dim randomIndex As Integer = Rand.Next(files.Count)
MessageBox.Show(files(randomIndex))