Я хотел бы записать макрос, чтобы проверить через файлы в моем каталоге проекта и найти файлы, которые не включены в проект.
В проигрывании вокруг с объектом DTE, я вижу что Project
объект имеет ProjectItems
; если a ProjectItem
представляет каталог, затем он имеет свое собственное ProjectItems
набор. Это дает мне все файлы, которые включены в проект.
Таким образом, я мог проверить рекурсивно через каждый набор ProjectItems, и для каждого ProjectItem это - каталог, проверьте, чтобы видеть, существуют ли файлы в файловой системе, которые не имеют соответствующего ProjectItem. Это кажется неуклюжим, все же.
Какие-либо идеи более простого способа приблизиться к этому?
Спасибо @JaredPar и @lpthnc за то, что указали мне правильное направление. В итоге я использовал подход, очень похожий на то, что @JaredPar очертил выше. Вот мой рабочий макрос FWIW.
Imports System.IO
Imports System.Collections.Generic
Imports EnvDTE
Public Module Main
Sub IncludeNewFiles()
Dim Count As Integer = 0
For Each Project As Project In DTE.Solution.Projects
If Project.UniqueName.EndsWith(".vbproj") Then
Dim NewFiles As List(Of String) = GetFilesNotInProject(Project)
For Each File In NewFiles
Project.ProjectItems.AddFromFile(File)
Next
Count += NewFiles.Count
End If
Next
DTE.StatusBar.Text = String.Format("{0} new file{1} included in the project.", Count, If(Count = 1, "", "s"))
End Sub
Private Function GetAllProjectFiles(ByVal ProjectItems As ProjectItems, ByVal Extension As String) As List(Of String)
GetAllProjectFiles = New List(Of String)
For Each ProjectItem As ProjectItem In ProjectItems
For i As Integer = 1 To ProjectItem.FileCount
Dim FileName As String = ProjectItem.FileNames(i)
If Path.GetExtension(fileName).ToLower = Extension Then
GetAllProjectFiles.Add(fileName)
End If
Next
GetAllProjectFiles.AddRange(GetAllProjectFiles(ProjectItem.ProjectItems, Extension))
Next
End Function
Private Function GetFilesNotInProject(ByVal Project As Project) As List(Of String)
Dim StartPath As String = Path.GetDirectoryName(Project.FullName)
Dim ProjectFiles As List(Of String) = GetAllProjectFiles(Project.ProjectItems, ".vb")
GetFilesNotInProject = New List(Of String)
For Each file In Directory.GetFiles(StartPath, "*.vb", SearchOption.AllDirectories)
If Not ProjectFiles.Contains(file) Then GetFilesNotInProject.Add(file)
Next
End Function
End Module
Подход, который я бы использовал, состоит в том, чтобы
Вот небольшой бит кода-пример
Function ContainsItem(p as Project, fileName as String) As Boolean
Try
Return p.ProjectItems.Item(fileName)
Catch ex As ArgumentException
Return False
End Try
End Function
Function CotainsItem(dte as DTE, fileName as String) As Boolean
For Each p As Project in dte.Solution.Projects
Return ContainsItem(p, fileName)
Next
End Function
Function GetFilesNotInProject(dte as DTE, startPath as String) as List(Of String)
Dim list As New List(Of String)
Dim files = Directory.GetFiles(startPath, "*.cs", SearchOPtions.AllDirectories)
For Each file in files
If Not ContainsItem(dte, file) Then
list.Add(file)
End If
Next
Return list
End Function