【问题标题】:unable to sort the files getting from system in visual basic无法在 Visual Basic 中对从系统获取的文件进行排序
【发布时间】:2023-03-29 05:13:02
【问题描述】:

我正在尝试在我的应用程序中从系统中获取文件。但是在检索文件时,它曾经来过,但不是按排序顺序。我希望我的所有文件都按排序顺序排列。我对这个视觉基础很陌生,我尝试了很多东西,但无法按排序顺序获取文件。请帮帮我,提前谢谢。

这是我的代码:-

 Dim path As String = "C:/UTRelOFA/Reva Test/src/00000178"
    Dim oFolder As New DirectoryInfo(path)

   Dim arr =  oFolder.GetFiles(".tif")
     Array.Sort(arr)
    Cosole.writeline(arr)

我使用了很多东西并参考了这个链接: Sorting Directory.GetFiles()

【问题讨论】:

  • 您在一次调用GetFiles 返回的数组上调用Array.Sort,但随后您只需丢弃该数组并再次调用GetFiles 并使用该未排序的结果。您需要将GetFiles 的结果实际分配给您的arr 变量,然后将arr 传递给Array.Sort。另外,在声明 arr 时不要指定它的大小。您不创建数组。 GetFiles 创建它,大小由它获取的文件数决定。
  • arr = oFolder.GetFiles(".tif") 并将其传递给 Array.Sort(arr) 你在说这个吗?我已经尝试过了,但这不起作用@jmcilhinney
  • 你能提供我正确的代码来解决这个问题吗?这对我会有帮助
  • 您甚至不需要指定类型。您可以使用Dim arr = oFolder.GetFiles("*.tif") 来执行此操作,变量的类型将从方法的返回类型中推断出来。另请注意,搜索模式需要是“*.tif”而不是“.tif”。您的模式不会匹配任何内容,因为没有具有该确切名称的文件。
  • 另外,请在项目属性中转Option Strict On。这将有助于在编译时而不是在运行时发现与错误数据类型相关的问题。

标签: vb.net


【解决方案1】:

这里的问题是您应该致电DirectoryInfo.GetFiles 还是Directory.GetFiles。如果你调用前者,那么你会得到一个 FileInfo 数组,所以如果你想按文件名排序,那么你必须明确指定,例如

Dim folderPath = "C:\UTRelOFA\Reva Test\src\00000178"
Dim folder As New DirectoryInfo(folderPath)
Dim files = folder.GetFiles("*.tif")

Array.Sort(files, Function(fi1, fi2) fi1.Name.CompareTo(fi2.Name))

如果您实际上不需要FileInfo 对象而只需要文件路径,请不要使用DirectoryInfo,例如

Dim folderPath = "C:\UTRelOFA\Reva Test\src\00000178"
Dim filePaths = Directory.GetFiles(folderPath, "*.tif")

Array.Sort(filePaths)

【讨论】:

  • 作为 Array.Sort 的替代品,我更喜欢使用一点 Linq。 Dim sortedFiles = From file In files Select file Order By file.Name
  • 我考虑过添加 LINQ 替代方案,但我想我会保持简单。如果我打算使用 LINQ,我会倾向于使用函数语法,即Dim sortedFiles = files.OrderBy(Function(fi) fi.Name).ToArray()。请注意,使用查询语法或函数语法时,ToArrayToList 调用几乎是必需的,除非您只想对结果运行单个 For Each 循环。
  • 因为我一直在使用 .ToArray 或 .ToList 我忘记了这一点。从朴素的 Linq 查询返回的奇怪的(对我而言)数据类型使我总是使用我更熟悉的东西。谢谢提醒。
  • @Mary,您可以考虑使用 LINQ 查询来简单地返回 IEnumerable(Of T)。它通常是比这更具体的类型,具体取决于最后调用的扩展方法,但它是 IEnumerable(Of T) 的事实几乎是最重要的。这意味着如果您只想用For Each 枚举它,那么您可以按原样使用它,但如果您想随机访问这些项目,那么您应该调用ToArrayToList
  • 再次感谢@jmcilhinney。连我都能理解的解释!一个返回值中的接口和泛型足以吓到我。 :-) 保存到我的参考文件中。顺便说一句,“在结果上运行一个 For Each 循环”我尝试运行第二个 For Each 并且它仍然有效。对不起,挑剔,但我嫁给了一位工程师。 :-)
猜你喜欢
  • 1970-01-01
  • 2012-02-16
  • 1970-01-01
  • 2016-07-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多