Макрос Visual Studio: Найдите файлы, которые не включены в проект?

Я хотел бы записать макрос, чтобы проверить через файлы в моем каталоге проекта и найти файлы, которые не включены в проект.

В проигрывании вокруг с объектом DTE, я вижу что Project объект имеет ProjectItems; если a ProjectItem представляет каталог, затем он имеет свое собственное ProjectItems набор. Это дает мне все файлы, которые включены в проект.

Таким образом, я мог проверить рекурсивно через каждый набор ProjectItems, и для каждого ProjectItem это - каталог, проверьте, чтобы видеть, существуют ли файлы в файловой системе, которые не имеют соответствующего ProjectItem. Это кажется неуклюжим, все же.

Какие-либо идеи более простого способа приблизиться к этому?

8
задан Herb Caudill 4 January 2010 в 15:26
поделиться

2 ответа

Спасибо @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
8
ответ дан 5 December 2019 в 07:58
поделиться

Подход, который я бы использовал, состоит в том, чтобы

  1. Перечислить файловую систему, ищущую все файлы
  2. Проверить и посмотреть, есть ли в данном файле связанный с ним элемент проекта.

Вот небольшой бит кода-пример

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
2
ответ дан 5 December 2019 в 07:58
поделиться
Другие вопросы по тегам:

Похожие вопросы: