Vb.net 使用列表中的Directory.GetFiles避免某些文件

Vb.net 使用列表中的Directory.GetFiles避免某些文件,vb.net,image,Vb.net,Image,在这个应用程序中,我正在处理用户从一个组合框中选择一个子文件名,该子文件夹中最多有5张图片(在开始处)。这些图像的名称是相机输出的,这意味着我不知道文件名。此应用程序的目的是让用户预览1-5个小缩略图图片框中的图像,然后一次选择一个,并使用radiobuttons options中的文本字符串保存它们,按下“重命名”按钮后,代码将所选图像保存为所选名称 所有这些都有效,但我有两个问题 第一。保存图像后,文件夹中现在有5张以上的jpeg图像,这些正在保存的图像将始终包含以下文字: pic主轴、Pi

在这个应用程序中,我正在处理用户从一个组合框中选择一个子文件名,该子文件夹中最多有5张图片(在开始处)。这些图像的名称是相机输出的,这意味着我不知道文件名。此应用程序的目的是让用户预览1-5个小缩略图图片框中的图像,然后一次选择一个,并使用radiobuttons options中的文本字符串保存它们,按下“重命名”按钮后,代码将所选图像保存为所选名称

所有这些都有效,但我有两个问题

第一。保存图像后,文件夹中现在有5张以上的jpeg图像,这些正在保存的图像将始终包含以下文字:

pic主轴、PicRotorTop、PicRotorBottom、PicDunnageFinal或PicDunnageLayer

那么,有没有办法避免使用我已有的代码在
目录.GetFiles
中使用那些字符串的jpeg文件呢?也许有更好的方法可以做到这一点,但这是我用我的知识所能做的一切。可以使用
file.move
或以某种方式替换图像,而不是将图像保存为新名称并向文件夹中添加更多jpeg文件

第二,一旦我知道如何在jpeg
getfile
名称中排除上述字符串,我需要使用我将添加的“清除图片”按钮释放和删除所有旧文件

我在网上得到了一些代码,整天都在拼凑。但现在我遇到了一个路障,找不到任何能帮助我度过这一关的东西

代码:

GetFiles代码:

 Public Sub Picture_Preview()
Dim FileName As String = cmbPartNumber.Text
Dim pics() As PictureBox
Dim List() As String = Directory.GetFiles("\\HOMESHARE01\Public\Reference Cards\Completed Reference Cards by Part Number" & "\" & FileName, "*.jpg")

If List.Length = "5" Then
    pics = {picPreview1, picPreview2, picPreview3, picPreview4, picPreview5}
End If
If List.Length = "4" Then
    pics = {picPreview1, picPreview2, picPreview3, picPreview4}
End If
If List.Length = "3" Then
    pics = {picPreview1, picPreview2, picPreview3}
End If
If List.Length = "2" Then
    pics = {picPreview1, picPreview2}
End If
If List.Length = "1" Then
    pics = {picPreview1}
End If
If List.Length = "0" Then
    MsgBox("No Pictures in File")
    Exit Sub
End If

For i As Integer = 0 To pics.Count - 1

    pics(i).Image = Image.FromFile(List(i))

Next

picPreview1.SizeMode = PictureBoxSizeMode.StretchImage
picPreview2.SizeMode = PictureBoxSizeMode.StretchImage
picPreview3.SizeMode = PictureBoxSizeMode.StretchImage
picPreview4.SizeMode = PictureBoxSizeMode.StretchImage
picPreview5.SizeMode = PictureBoxSizeMode.StretchImage
picSelectedPic.SizeMode = PictureBoxSizeMode.StretchImage
End Sub

首先,您通常应该喜欢
EnumerateFiles()
而不是
GetFiles()
,尤其是如果您想过滤结果的话。这将使用一个助手函数筛选出您不想要的:

Dim txFiles = Directory.EnumerateFiles("C:\Temp", "*.*",
                                 System.IO.SearchOption.TopDirectoryOnly).
                             Where(Function(q) IncludeFile(q)).ToArray()
用于筛选它们的帮助函数:

Private Function IncludeFile(f As String) As Boolean
    Dim exclude() = {"PicSpindle", "PicRotor", "PicFoo"}
    Dim filepart As String

    For Each s In exclude
        filepart = Path.GetFileName(f)

        If filepart.StartsWith(s, StringComparison.InvariantCultureIgnoreCase) Then
            Return False
        End If
    Next
    Return True
End Function

你将不得不根据细节来调整排除逻辑……我无法在代码墙中找到你的
GetFiles
来检查它。

首先,你应该倾向于
EnumerateFiles()
而不是
GetFiles()
,尤其是如果你想过滤结果的话。这将使用一个助手函数筛选出您不想要的:

Dim txFiles = Directory.EnumerateFiles("C:\Temp", "*.*",
                                 System.IO.SearchOption.TopDirectoryOnly).
                             Where(Function(q) IncludeFile(q)).ToArray()
用于筛选它们的帮助函数:

Private Function IncludeFile(f As String) As Boolean
    Dim exclude() = {"PicSpindle", "PicRotor", "PicFoo"}
    Dim filepart As String

    For Each s In exclude
        filepart = Path.GetFileName(f)

        If filepart.StartsWith(s, StringComparison.InvariantCultureIgnoreCase) Then
            Return False
        End If
    Next
    Return True
End Function

你将不得不根据细节修改排除逻辑……我无法在那堵代码墙中找到你的
GetFiles
,来检查它。

需要查看的代码太多了。“正在保存的这些图片将始终包含这些单词”,您是指这些图片的文件名吗?顺便说一句,
Image.Save
为jpeg可能会产生令人失望的结果。您可能希望查看并使用更高质量的设置(如80&)。这需要查看大量代码。“正在保存的这些图片将始终包含这些单词”,您是指这些图片的文件名吗?顺便说一句,
Image.Save
为jpeg可能会产生令人失望的结果。你可能想看看并使用一个更高质量的设置(比如80&)。哈哈,对不起,上次我问一个问题,这里有人给了我一个困难的时间,因为我没有把我所有的代码。我更新了问题,所以它将
GetFiles
sub分割出来。谢谢,我会尝试使用Helper。效果很好!我不得不改变一些逻辑,但是的,它是有效的,谢谢!哈哈,对不起,上次我问了一个问题,有人在这里给了我一个困难的时间,因为我没有把我所有的代码。我更新了问题,所以它将
GetFiles
sub分割出来。谢谢,我会尝试使用Helper。效果很好!我不得不改变一些逻辑,但是的,它是有效的,谢谢!