Comment afficher les dossiers qui ne contiennent pas de "JPG"?

Résolu
dickeden Messages postés 3 Date d'inscription mercredi 23 juillet 2014 Statut Membre Dernière intervention 28 juillet 2014 - Modifié par dickeden le 24/07/2014 à 02:37
Whismeril Messages postés 19025 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 19 avril 2024 - 28 juil. 2014 à 06:18
Bonjour,

à partir du programme "MAGIC FILE NAME" (auteur : Erudix, juillet 2012) j'ai fait des modifications pour mon usage précis; merci Erudix pour la base. Bref. J'aimerais savoir si c'est possible d'avoir la liste des dossiers qui n'ont pas de fichiers JPG. Avoir tous les fichiers JPG c'est facile, mais le contraire.

Exemple de la structure de dossier dans le ListBox1 :
C:\photos\001\000\x.jpg
C:\photos\001\000\correction\x.txt
C:\photos\001\000\correction\x.EPS
C:\photos\001\003\x.jpg
C:\photos\001\003\correction\x.txt
C:\photos\001\003\Approuve\x.txt
C:\photos\001\010\x.cdr
C:\photos\001\010\correction\x.txt
C:\photos\001\010\correction\x.EPS
C:\photos\002\003\x.jpg
C:\photos\002\003\correction\x.txt
C:\photos\002\003\Approuve\x.txt

La réponse est :
C:\photos\001\010

(j'ai pas besoin des sous-dossiers)

Dick
(logiciel : Microsoft Visual Basic 2010 Express)

Edit : Lien vers la source :
http://codes-sources.commentcamarche.net/source/54112-magic-file-name-renommez-vos-fichiers-automagiquement

5 réponses

Whismeril Messages postés 19025 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 19 avril 2024 656
24 juil. 2014 à 06:46
Bonjour, ce qu'il faudrait tu tu postes, c'est la partie de code que tu as modifié, et en couleur. Voir ici comment bien utiliser la coloration syntaxique.
0
D'accord avec Whismeril, poster les évolutions des modifications ou faire une nouvelle publication en citant l'auteur d'origine, à minima décrire les évolutions
Pour répondre au besoin je me suis fait un Script DOS avec les commandes DIR et FOR et pour voir les répertoires vides j'utilise la commande FINDSTR

@echo off
set dossier=%cd%
set /A fichier=0
setlocal enableDelayedExpansion 
for /f "delims=""" %%i in ('dir "%dossier%\*.*" /b /s') do ( 
 if %%~xiB==B ( 
  set fichier=0 
  for /f "delims=""" %%j in ('dir "%%i" *.* /b /s') do (
      if %%~xjB==jpgB set /a fichier+=1
  )
  if !fichier! NEQ 0  echo !fichier!%%i
  )  
)
0
Whismeril Messages postés 19025 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 19 avril 2024 656
24 juil. 2014 à 10:34
Merci donc si tu es d'accord avec moi d'utiliser la colaration syntaxique!
Je modifie ton message.

Par contre la question est posé en VB.Net pas en DOS....
0
dickeden Messages postés 3 Date d'inscription mercredi 23 juillet 2014 Statut Membre Dernière intervention 28 juillet 2014
25 juil. 2014 à 04:27
Merci à ceux qui se cassent les dents sur ce petit "problème" !

J'arrive à une solution : faire la soustraction de 2 ListBox !

Dans la ListBox1 j'ai la liste de tous les fichiers avec le filtre de collection = JPG :

#Region "Actualise_Liste "

    Public Function Actualise_Liste()

        ListBox1.Items.Clear()

        Try
            If ckb_sous_dossier.Checked = True And ckb_extension.Checked = True Then ' Inclure sous-dossier + extension
                For Each files In My.Computer.FileSystem.GetFiles(txt_path.Text, FileIO.SearchOption.SearchAllSubDirectories, cbx_extension.Text)
                    ListBox1.Items.Add(files) ' on ajoute le chemin des fichiers à la ListBox
                Next
            End If

            


J'ai essayé : ...SearchAllSubDirectories, NOT cbx_extension.Text). VB.net n'a pas aimé mon humour!!

Sans le filtre, c'est ce code qui est exécuté: tous les fichiers avec les sous-dossiers. Le résultat va dans la ListBox1

If ckb_sous_dossier.Checked = True And ckb_extension.Checked = False Then ' Inclure sous-dossier
                For Each files In My.Computer.FileSystem.GetFiles(txt_path.Text, FileIO.SearchOption.SearchAllSubDirectories)
                    ListBox1.Items.Add(files) ' on ajoute le chemin des fichiers à la ListBox
                Next
            End If


Voilà mon idée, remplir 2 ListBox (c'est facile!) et faire la soustraction !

ListBox2.........................................................ListBox1
C:\photos\001\000\x.jpg...............................C:\photos\001\000\x.jpg
C:\photos\001\000\correction\x.txt..............C:\photos\002\003\x.jpg
C:\photos\001\000\correction\x.EPS
C:\photos\001\010\x.cdr
C:\photos\001\010\correction\x.txt
C:\photos\001\010\correction\x.EPS
C:\photos\002\003\x.jpg
C:\photos\002\003\correction\x.txt
C:\photos\002\003\Approuve\x.txt

Résultat espéré (dossier qui n'as pas de JPG):
C:\photos\001\010

Question, comment faire? (Cela à déjà été un sujet ?)

J'espère avoir été une peu plus claire!

Merci d'avance

Dick
0
Whismeril Messages postés 19025 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 19 avril 2024 656
25 juil. 2014 à 08:13
Bonjour, les commentaires servent à la digression sur un message, là il s'agissait plutôt d'une réponse (le gros bouton bleu Répondre). Je l'ai donc transformé en réponse.
0
Whismeril Messages postés 19025 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 19 avril 2024 656
Modifié par Whismeril le 25/07/2014 à 10:37
Pour ta question, je ne sais pas le faire en VB.Net, donc je l'ai écrit en C# et passé par un traducteur (qui vaut ce qu'il vaut...)
J'ai fait une solution simple, mais pas forcément optimisée, ça ira si tu n'a pas des (dizaines de ?) milliers de fichiers à verifier.

    Public Function QuestionDickeden(ByVal CheminAScanner As String, ByVal ExtensionAExclure As String) As List(Of String)

        Dim dossierSansExtention As New List(Of String)()

        For Each dossier1 As String In Directory.GetDirectories(CheminAScanner) 'là je cherche à partir de ta "racine" ca va me dire que dans C:\Photos, il y a 001 et 002
            For Each dossier2 As String In Directory.GetDirectories(dossier1) 'là je cherche un nouveau sous la "racine" ca va me dire que dans 001, il y a.....
                Dim tousFichiers() As String = Directory.GetFiles(dossier2, "*.*", SearchOption.AllDirectories) 'liste de tous les fichiers dans ce dossier incluant les sous répertoires
                Dim existeJpg As Boolean = tousFichiers.Any(Function(c) c.EndsWith(ExtensionAExclure, StringComparison.CurrentCultureIgnoreCase)) 'return true s'il y a au moins un jpg dans le dossier ou un sous répertoire, j'ignore la casse au cas ou l'extenstion soit en majuscule et le paramètre en minuscule ou l'inverse.

                If Not existeJpg Then 's'il n'y a pas de fichiers avec l'extention à exclure, on ajoute le dossier principal à la liste
                    dossierSansExtention.Add(dossier2)
                End If
            Next dossier2
        Next dossier1

        Return dossierSansExtention
    End Function


j'appelle la méthode comme ça
QuestionDickeden("c:\photos", ".jpg")


La classe Directory nécessite un Imports de System.IO.

Penser aux balises de coloration syntaxique: bouton <>, préciser le langage :<code csharp>.
Quand la solution est trouvée, mettre la discussion Résolue.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
dickeden Messages postés 3 Date d'inscription mercredi 23 juillet 2014 Statut Membre Dernière intervention 28 juillet 2014
28 juil. 2014 à 01:03
Merci Whismeril pour ton aide.
voici le code

If ckb_sous_dossier.Checked = True And ckb_sansjpg.Checked = True And ckb_extension.Checked = True Then ' dossier sans JPG
     Dim existeJpg As Boolean = False
     Dim tp() As String = Split(txt_path.Text, "\") 'compteur pour la profondeur des sous-dossiers
     Dim profondeur As Integer = tp.Count + num_haut_bas1.Value ' numeric_up_down
     For Each files In My.Computer.FileSystem.GetDirectories(txt_path.Text, FileIO.SearchOption.SearchAllSubDirectories)
          For Each files1 In My.Computer.FileSystem.GetFiles(files, FileIO.SearchOption.SearchAllSubDirectories, cbx_extension.Text)
                 existeJpg = True
           Next files1
           If existeJpg Then
              existeJpg = False
           Else
              Dim t() As String = Split(files, "\")
              If t.Count <= profondeur Then
                 ListBox1.Items.Add(files) ' on ajoute le chemin des fichiers à la ListBox
              End If
           End If
    Next files
End If


J'ai ajouté un objet pour avoir un contrôle sur la profondeur dans la recherche des sous-dossiers: num_haut_bas1.
La première recherche est un "GetDirectories", ensuite on fait un "GetFiles". Et voilà! Avec le filtre (cbx_extension.Text), je peux avoir tous les autres formats : présents ou absents.
0
Whismeril Messages postés 19025 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 19 avril 2024 656
28 juil. 2014 à 06:18
De rien
0
Rejoignez-nous