2010-01-04 6 views
8

Je voudrais écrire une macro pour explorer les fichiers de mon répertoire de projet et trouver les fichiers qui ne sont pas inclus dans le projet. En jouant avec l'objet DTE, je vois que l'objet Project a ProjectItems; Si un ProjectItem représente un répertoire, alors il possède sa propre collection ProjectItems. Cela me donne tous les fichiers inclus dans le projet.Macro Visual Studio: recherchez les fichiers qui ne sont pas inclus dans le projet?

Ainsi, je pourrais explorer de manière récursive chaque collection ProjectItems, et pour chaque ProjectItem qui est un répertoire, vérifier s'il y a des fichiers dans le système de fichiers qui n'ont pas de ProjectItem correspondant. Cela semble maladroit, cependant.

Des idées d'une façon plus simple d'aborder cela?

+0

obtenir une liste de tous les répertoires concernés, trouver tous les fichiers sont, enregistrer leurs chemins complets dans une structure de données de jeu. Maintenant parcourez tous les fichiers de votre projet et retirez-les de l'ensemble (pré-pend le bon chemin). Ensuite, examinez ce qu'il vous reste ... –

+0

Merci - pourquoi ne pas simplement poster ceci comme réponse? –

Répondre

8

Merci à @JaredPar et @lpthnc pour moi pointant dans la bonne direction. J'ai fini par utiliser une approche très similaire à ce que @JaredPar décrit ci-dessus. Voici ma macro de travail 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 
+0

Cela fonctionnera-t-il pour toute la solution? J'ai beaucoup de fichiers exclus que je veux supprimer. –

+0

@SohamDasgupta - vous devrez probablement parcourir les projets de la solution un par un, et le faire pour chacun d'entre eux. –

+0

Il semble que [Les macros ne sont plus disponibles dans Visual Studio 2012] (http://www.dzone.com/articles/missing-macros-visual-studio). Toute solution possible pour VS 2012? –

2

L'approche que je prendrais est

  1. énumèrent le système de fichiers à la recherche de tous les fichiers
  2. Vérifiez et voyez si le fichier a donné un élément de projet associé.

est ici un peu rapide de code exemple

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 
+0

Merci - cela a beaucoup aidé. Cela ne fonctionne pas comme prévu, car 'p.ProjectItems' ne contient que des éléments à la racine du projet; vous devez parcourir la collection ProjectItems de chaque ProjectItem à tour de rôle. Dans le code que j'ai posté, je construis une liste de fichiers existants, puis je l'utilise pour voir ce qui n'est pas inclus. –

11

Voici la version C# de votre code:

public static void IncludeNewFiles() 
{ 
    int count = 0; 
    EnvDTE80.DTE2 dte2; 
    List<string> newfiles; 

    dte2 = (EnvDTE80.DTE2)System.Runtime.InteropServices.Marshal.GetActiveObject("VisualStudio.DTE.10.0"); 

    foreach (Project project in dte2.Solution.Projects) 
    { 
     if (project.UniqueName.EndsWith(".csproj")) 
     { 
      newfiles = GetFilesNotInProject(project); 

      foreach (var file in newfiles) 
       project.ProjectItems.AddFromFile(file); 

      count += newfiles.Count; 
     } 
    } 
    dte2.StatusBar.Text = String.Format("{0} new file{1} included in the project.", count, (count == 1 ? "" : "s")); 
} 

public static List<string> GetAllProjectFiles(ProjectItems projectItems, string extension) 
{ 
    List<string> returnValue = new List<string>(); 

    foreach(ProjectItem projectItem in projectItems) 
    { 
     for (short i = 1; i <= projectItems.Count; i++) 
     { 
      string fileName = projectItem.FileNames[i]; 
      if (Path.GetExtension(fileName).ToLower() == extension) 
       returnValue.Add(fileName); 
     } 
     returnValue.AddRange(GetAllProjectFiles(projectItem.ProjectItems, extension));   
    } 

    return returnValue; 
} 

public static List<string> GetFilesNotInProject(Project project) 
{ 
    List<string> returnValue = new List<string>(); 
    string startPath = Path.GetDirectoryName(project.FullName); 
    List<string> projectFiles = GetAllProjectFiles(project.ProjectItems, ".cs"); 

    foreach (var file in Directory.GetFiles(startPath, "*.cs", SearchOption.AllDirectories)) 
     if (!projectFiles.Contains(file)) returnValue.Add(file); 

    return returnValue; 
} 
0

je partirais avec PowerShell. Le script PowerShell dans mon autre post le fera pour vous. Le script récupérera la liste des fichiers inclus dans le fichier de projet et les comparera avec les fichiers sur le disque. Vous obtiendrez l'ensemble des fichiers qui sont sur le disque mais non inclus dans le projet. Vous pouvez les supprimer ou les suspendre en tant que suppressions pour TFS.

https://stackoverflow.com/a/23420956/846428

Questions connexes