所以目前我在共享网络上有一个区域,其中包含每个产品的子文件夹。
所以现在我的文件夹层次结构如下:
Test Root Folder <--- This is my master folder
Category 1
Product 1 <--- this is the folder I'm trying to find
Product 2
Product 3
Category 2
Product 6
Product 7
Category 3
Category 4
Product 12
产品文件夹总是采用这种格式&#34; 1234 - 产品1&#34;,通常当我搜索它时,我知道开头所以我知道&#39; 1234&#39;在这种情况下,我不知道它在哪个类别,也不知道标题&#39;产品1&#39;只是1234年。
如何自动执行此搜索?
到目前为止这是我的代码
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Windows.Forms;
using System.IO;
namespace HCA
{
public partial class MainForm : Form
{
public MainForm()
{
InitializeComponent(); // For WindowsDesigner DO NOT REMOVE
}
void Button1Click(object sender, EventArgs e)
{
string folderPath = @"C:\Users\Mike\Desktop\YBA Test";
string searchPattern = textBox1.Text & " - *";
DirectoryInfo dir= new DirectoryInfo(folderPath);
DirectoryInfo[] directories =
dir.GetDirectories(searchPattern, SearchOption.AllDirectories);
foreach (DirectoryInfo dir in directories)
{
listBox1.Items.Add(dir.Path);
}
}
void Button2Click(object sender, EventArgs e)
{
listBox2.Items.Clear;
}
}
}
现在我希望用户在textBox1中输入一个数字,例如&#34; 1234&#34;当他们点击按钮1时,新项目将被添加到listBox1作为目录的超链接&#34; C:\ Users \ Mike \ Desktop \ YBA Test \ CCA ** 1234 - 测试** \&#34;
答案 0 :(得分:1)
如果是VBA,以下可能会做到这一点:
Option Compare Database
Option Explicit
Public Sub MyFind()
' basis for this module coming from this URL :
' https://stackoverflow.com/questions/22645347/loop-through-all-subfolders-using-vba
Dim FileSystem As Object
Dim HostFolder As String
Dim ProductToSearchFor As String
HostFolder = "B:\" ' "W:\xtodel"
ProductToSearchFor = "Product 7" ' "1234"
Set FileSystem = CreateObject("Scripting.FileSystemObject")
DoFolder FileSystem.GetFolder(HostFolder), ProductToSearchFor
End Sub
Private Sub DoFolder(Folder, ProductToSearchFor As String)
Dim SubFolder As Object
Debug.Print "'" & Folder & Space(50 - Len(Folder)) & " // Name-Part = " & Folder.Name
For Each SubFolder In Folder.SubFolders
DoFolder SubFolder, ProductToSearchFor
Next
If Left(Folder.Name, Len(ProductToSearchFor)) = ProductToSearchFor Then
Debug.Print "' ==>> FOUND !"
MsgBox "Found !", vbInformation
End If
End Sub
这可能会在您的VBA-Direct窗口中显示以下结果:
'B:\ // Name-Part =
'B:\Test Root Folder // Name-Part = Test Root Folder
'B:\Test Root Folder\Category 1 // Name-Part = Category 1
'B:\Test Root Folder\Category 1\Product 1 // Name-Part = Product 1
'B:\Test Root Folder\Category 1\Product 2 // Name-Part = Product 2
'B:\Test Root Folder\Category 1\Product 3 // Name-Part = Product 3
'B:\Test Root Folder\Category 2 // Name-Part = Category 2
'B:\Test Root Folder\Category 2\Product 6 // Name-Part = Product 6
'B:\Test Root Folder\Category 2\Product 7 // Name-Part = Product 7
' ==>> FOUND !
'B:\Test Root Folder\Category 3 // Name-Part = Category 3
'B:\Test Root Folder\Category 4 // Name-Part = Category 4
'B:\Test Root Folder\Category 4\Product 12 // Name-Part = Product 12
答案 1 :(得分:0)
这是对2017年10月1日答案的补充。我试图使递归更加不言自明,最后,它演变为此。一个很好的例子,一些事情会变得复杂。
Option Compare Database
Option Explicit
'
' two variables at module level in order to exit the recursion if needed
'
Dim ProductFolderIsFound As Boolean ' keep track if product-folder is found
Dim TheFoundProductFolder As String ' return the full-path if product-folder is found
Dim FolderCounter As Long ' trying to keep track of the recursion
'
' check for multiple occurrences, switch the comment before the line with 'true' and 'false'
'
Const StopWhenFound As Boolean = False ' yes or no
'Const StopWhenFound As Boolean = True ' yes or no
Const UncPathDivider As String = ";" & vbCrLf ' if found, separate them by this string
'##################'
Public Sub MyFind()
'
' basis for this module coming from this URL :
' https://stackoverflow.com/questions/22645347/loop-through-all-subfolders-using-vba
'
Dim FileSystem As Object ' will become 'Scripting.FileSystemObject'
Dim HostFolder As String ' base-location for the search
Dim ProductToSearchFor As String
'----------------
' Initialisation
'----------------
HostFolder = "B:\" ' "Z:\path\to\search"
'ProductToSearchFor = "1234"
'ProductToSearchFor = "Product 7"
'ProductToSearchFor = "Category 2"
ProductToSearchFor = "Product 1"
FolderCounter = 1
' parameters for the recursion
ProductFolderIsFound = False ' in the start, productfolder is not yet found ;-)
TheFoundProductFolder = "" ' in the start, productfolder is not yet found ;-)
'-------------------
' get the work done
'-------------------
' debug message
Debug.Print "' ==>> searching for : '" & ProductToSearchFor & _
"' , starting in location : '" & HostFolder & "' <<=="
' give FileSystem his necessary type, in order to call the function '.GetFolder'
' ==>> debug.print VarType(FileSystem) will still return '9', like type 'Object'
Set FileSystem = CreateObject("Scripting.FileSystemObject")
' start of recursion, by passing the base location as a 'Scripting.FileSystemObject'
DoFolder FileSystem.GetFolder(HostFolder), ProductToSearchFor, FolderCounter, ""
'--------
' result
'--------
'
' What to do when yes or no the product-folder is found
'
If ProductFolderIsFound Then
Debug.Print "' ==>> Found : " & vbCrLf & TheFoundProductFolder & "' <<=="
Else
Debug.Print "' ==>> NOT found : '" & ProductToSearchFor & _
"' in location : '" & HostFolder & "' <<=="
End If
End Sub
'###################'
Private Sub DoFolder(ByVal Folder As Object, _
ByVal ProductToSearchFor As String, _
ByVal FolderID As Long, _
ByVal PreviousFolderIDs As String) ' important : ByVal instead of ByRef
'
' the parameter 'Folder' [will be/needs to be] compatable type 'Scripting.FileSystemObject'
' because we use the function '.GetFolders' and the property '.Name'
'
Dim SubFolder As Object
Dim MessageLine As String
'
' create a debug-message-line : "'" & Folder & (some spaces) & "//Name-Part = " & Folder.Name
' remember, 'Folder' returns the full path and 'Folder.Name' only the last part of the full path
'
MessageLine = "'" & PreviousFolderIDs & "__" & FolderID & ""
If Len(MessageLine) <= 15 Then
' make the message at least 50 characters, so the 'name-part' can be in a second column
MessageLine = MessageLine & Space(15 - Len(MessageLine))
End If
MessageLine = MessageLine & Folder
If Len(MessageLine) <= 60 Then
' make the message at least 50 characters, so the 'name-part' can be in a second column
MessageLine = MessageLine & Space(60 - Len(MessageLine))
End If
MessageLine = MessageLine & "//Name-Part = " & Folder.Name
Debug.Print MessageLine
'-------------
' try to find
'-------------
'
' if the 'Folder' is the desired product-folder, stop searching
' if desired switch the function 'Mid' with the 'Left'
'
'If Left(Folder.Name, Len(ProductToSearchFor)) = ProductToSearchFor Then
If InStr(Folder.Name, ProductToSearchFor) > 0 Then
Debug.Print "'" & Space(14) & "searching for : " & ProductToSearchFor & " ==>> FOUND !"
' let the rercursive stack know that the folder is found
ProductFolderIsFound = True
' return the full location of the desired product-folder
TheFoundProductFolder = TheFoundProductFolder & Folder & UncPathDivider
If ProductFolderIsFound And StopWhenFound Then
'MsgBox "Found !", vbInformation
Exit Sub
End If
End If
'---------------------------------
' recursive call for this funtion
'---------------------------------
'
' if product-folder not yet found, check all the subfolders of the current 'Folder'
'
For Each SubFolder In Folder.SubFolders
FolderCounter = FolderCounter + 1
DoFolder SubFolder, ProductToSearchFor, FolderCounter, PreviousFolderIDs & FolderID & ";"
' if product-folder has been found, no need to scan further thru the folder-structure
If ProductFolderIsFound And StopWhenFound Then
Exit For
End If
Next
End Sub
这可能会在您的VBA-Direct窗口中显示以下结果:
'##################################'
Private Sub VBA_Window_Direct_003()
'
'myfind
' ==>> searching for : 'Product 1' , starting in location : 'B:\' <<==
'__1 B:\ //Name-Part =
'1;__2 B:\Test Root Folder //Name-Part = Test Root Folder
'1;2;__3 B:\Test Root Folder\Category 1 //Name-Part = Category 1
'1;2;3;__4 B:\Test Root Folder\Category 1\Product 1 //Name-Part = Product 1
' searching for : Product 1 ==>> FOUND !
'1;2;3;__5 B:\Test Root Folder\Category 1\Product 2 //Name-Part = Product 2
'1;2;3;__6 B:\Test Root Folder\Category 1\Product 3 //Name-Part = Product 3
'1;2;__7 B:\Test Root Folder\Category 2 //Name-Part = Category 2
'1;2;7;__8 B:\Test Root Folder\Category 2\Product 6 //Name-Part = Product 6
'1;2;7;__9 B:\Test Root Folder\Category 2\Product 7 //Name-Part = Product 7
'1;2;__10 B:\Test Root Folder\Category 3 //Name-Part = Category 3
'1;2;__11 B:\Test Root Folder\Category 4 //Name-Part = Category 4
'1;2;11;__12 B:\Test Root Folder\Category 4\Product 12 //Name-Part = Product 12
' searching for : Product 1 ==>> FOUND !
' ==>> Found :
B:\Test Root Folder\Category 1\Product 1;
B:\Test Root Folder\Category 4\Product 12;
' <<==
End Sub
在第一列中,数字是不同子文件夹的缩写:1=B:
,2=Test Root Folder
,3=Category 1
等等。