2013-07-05 12 views
0

J'ai pris en compte la réponse et l'ai ajouté à mon code pour une raison quelconque, même si les fichiers ont des temps d'écriture très différents. prendre celui avec le chiffre le plus élevé dans son nom plutôt que celui avec l'heure d'écriture la plus récente.C# sélectionner le fichier le plus récent renvoyant "plus récent" basé sur le titre plutôt que d'écrire le temps

J'ai déjà posté cette question mais je n'ai pas pu obtenir de réponse, maintenant j'ai posté le code complet que j'utilise car je suis perplexe quant à ce que le problème est, POUR CLARIFIER: Mon but est de trier à travers un répertoire et d'obtenir certains fichiers, certains fichiers peuvent avoir le même nom et donc dans ce cas, je dois veiller à ce que seul le fichier le plus récent est pris, autant que je peux voir, j'ai expliqué cela dans mon code fonctionne pas .. Toute aide grandement appréciée

DirectoryInfo directoryInfo = new DirectoryInfo(@"D:\DevP\Custom"); 

    /// Returns latest writen file from the specified directory. 
    /// If the directory does not exist or doesn't contain any file, DateTime.MinValue  is returned. 
    /// <param name="directoryInfo">Path of the directory that needs to be scanned</param> 
    /// <returns></returns> 
    private static DateTime GetLatestWriteTimeFromFileInDirectory(DirectoryInfo directoryInfo) 
    { 
     if (directoryInfo == null || !directoryInfo.Exists) 
      return DateTime.MinValue; 

     FileInfo[] files = directoryInfo.GetFiles(); 
     DateTime lastWrite = DateTime.MinValue; 

     foreach (FileInfo file in files) 
     { 
      if (file.LastWriteTime > lastWrite) 
      { 
       lastWrite = file.LastWriteTime; 
      } 
     } 



     return lastWrite; 
    } 

    /// Returns latest writen timestamp file from the specified directory. 
    /// If the directory does not exist or doesn't contain any file, DateTime.MinValue is returned. 

    private static FileInfo GetLatestWritenFileFileInDirectory(DirectoryInfo directoryInfo) 
    { 
     if (directoryInfo == null || !directoryInfo.Exists) 
      return null; 

     FileInfo[] files = directoryInfo.GetFiles(); 
     DateTime lastWrite = DateTime.MinValue; 
     FileInfo lastWritenFile = null; 

     foreach (FileInfo file in files) 
     { 
      if (file.Name.StartsWith("GLA")) 
      { 
       if (file.LastWriteTime > lastWrite) 
       { 
        lastWrite = file.LastWriteTime; 
        lastWritenFile = file; 
       } 
      } 

      else if (file.Name.StartsWith("M&M")) 
      { 
       if (file.LastWriteTime > lastWrite) 
       { 
        lastWrite = file.LastWriteTime; 
        lastWritenFile = file; 
       } 
      } 

      else if (file.Name.StartsWith("TRIAL")) 
      { 
       if (file.LastWriteTime > lastWrite) 
       { 
        lastWrite = file.LastWriteTime; 
        lastWritenFile = file; 
       } 

      } 



     } 
     return lastWritenFile; 

}

public void Main() 
    { 
     String keywordHorizon = ((String)Dts.Variables["User::KeywordGLA"].Value).ToUpper(); 

     string filename = Dts.Variables["User::InputFile"].Value.ToString(); 
     string checkname = filename.ToUpper(); 



     if (Equals("CurrentProcess.arc", Dts.Variables["User::InputFile"].Value) == false) 
     { 
      String FullFilePath = filename; 
      int filecounter = 0; // Increment for counting files, if found 



      FileInfo fileinfo; 
      fileinfo = new FileInfo(FullFilePath); 

      if (checkname.Contains(keywordeHorizon)) 
      { 
       Dts.Variables["User::GLAFile"].Value = FullFilePath; 
       filecounter = 1; 
       if (fileinfo.Exists) 
       { 

        if (fileinfo.Length == 0) 
        { 
         Dts.Variables["User::FileHasNoData"].Value = true; 
         Dts.Variables["User::PackageStatus"].Value = "ERROR"; 
         Dts.Variables["User::Succeeded"].Value = false; 
        } 
        else 
         GetLatestWritenFileFileInDirectory(directoryInfo); 

       } 
      } 
      else if (checkname.Contains(keywordM&M)) 
      { 
       Dts.Variables["User::M&Mfile"].Value = FullFilePath; 
       filecounter = 1; 
       if (fileinfo.Exists) 
       { 
        if (fileinfo.Length == 0) 
        { 
         Dts.Variables["User::FileHasNoData"].Value = true; 
         Dts.Variables["User::PackageStatus"].Value = "ERROR"; 
         Dts.Variables["User::Succeeded"].Value = false; 
        } 

        else 
         GetLatestWritenFileFileInDirectory(directoryInfo); 

       } 

      } 
      else if (checkname.Contains(keywordTRIAL)) 
      { 
       Dts.Variables["User::TRIALFile"].Value = FullFilePath; 
       filecounter = 1; 
       if (fileinfo.Exists) 
       { 
        if (fileinfo.Length == 0) 
        { 
         Dts.Variables["User::FileHasNoData"].Value = true; 
         Dts.Variables["User::PackageStatus"].Value = "ERROR"; 
         Dts.Variables["User::Succeeded"].Value = false; 
        } 

        else 
         GetLatestWritenFileFileInDirectory(directoryInfo); 

       } 

      } 
      Dts.Variables["User::FileCount"].Value = (int)Dts.Variables["User::FileCount"].Value + filecounter; 
     } 



     Dts.TaskResult = (int)ScriptResults.Success; 
    } 
} 

}

+1

Qu'est-ce qui ne fonctionne pas? – Tigran

+0

'certains fichiers peuvent avoir le même nom', comment? Ils doivent varier au moins par extension, donc le nom ne sera pas par le même – wudzik

+0

dans le répertoire courant J'ai 4 fichiers, deux d'entre eux ont le même nom et cela provoque le programme ne fonctionne pas car il ne sélectionne pas le le plus récent et en utilisant ce – user2546071

Répondre

0

Pour obtenir le temps de modification du fichier (le plus récent) utilisent

FileInfo.LastWriteTime and FileInfo.LastWriteTimeUTC 

Ensuite, vous pouvez prendre fichier avec le dernier jour.

+0

Brilliant, à droite, j'ai ce travail "ish" mais maintenant je pense que peut-être mes premières pensées sur le problème où mal. J'ai le répertoire (toujours avec deux fichiers du même nom) mais quand je vérifie mon point d'arrêt, je peux voir que le tri fonctionne et qu'il sélectionne le plus récent mais il est toujours en panne parce qu'il y a deux fichiers du même nom, -il possible de spécifier dans ma fonction de tri de supprimer le fichier qui n'est pas le plus récent? désolé à ce sujet mais je suis un C# noob (clairement): P – user2546071

+0

@ user2546071 - "deux fichiers du même nom" - c'est encore impossible. S'il vous plaît, développez ce que vous essayez de dire et soyez aussi précis que possible à ce sujet. – Corak

+0

un fichier peut s'appeler dog1234 et l'autre s'appelle dog1243. Ma première pensée serait juste de comparer les noms, mais en fonction de la façon dont le système est censé fonctionner (en utilisant les mots-clés) ce n'est pas une option. En utilisant la réponse ci-dessus a résolu le problème de choisir le fichier le plus récent, mon problème est maintenant en supprimant le fichier le plus récent – user2546071

Questions connexes