2017-12-18 7 views
3

ファイル名に基づいて2つの異なるディレクトリのファイルリストを比較できる方法を書いています。 2番目のディレクトリに後で使用するリストには存在しません(これらのファイルをコピー/移動する別の方法を作成する可能性が高い)。C#名前に基づいてファイルのリストを比較してフルパスを返さない

ファイルのリスト(FilesRemaiingリスト)を見て、ファイルの完全なパスを取得しようとするまで、すべて正常に動作しているようです。それは私のビン/デバッグパスを指して終わる。

私の質問では、私は特にfile.FullNameではなく比較するfile.Nameを照会しているからだと思います。これは、FullNameがファイルと同様にパスを返すためです。これは、比較文(var FilesRemaining = FileList1.Except(FileList2).ToList();)には使用できません。

私の質問は、名前だけに基づいて2セットのファイルを比較する方法ですが、後でコピー/移動するために使用できる3番目のリストに例外リストの完全なパスを保存しますか?

はここに私の方法です:

public static List<string> CompareFiles(string ComparePath1, string ComparePath2) 
    { 
     List<string> FileList1 = new List<string>(); 
     List<string> FileList2 = new List<string>(); 
     List<string> CompareFileList = new List<string>(); 
     DirectoryInfo directory1 = new DirectoryInfo(ComparePath1); 
     FileInfo[] files1 = directory1.GetFiles("*.*", SearchOption.TopDirectoryOnly); 
     DirectoryInfo directory2 = new DirectoryInfo(ComparePath2); 
     FileInfo[] files2 = directory2.GetFiles("*.*", SearchOption.TopDirectoryOnly); 

     //Queries the given directory for filenames 
     var query1 = from file in files1 
       where (!file.Attributes.HasFlag(FileAttributes.Hidden)) 
        select (file.Name); 
     foreach (var file in query1) 
     { 
      FileList1.Add(file); 
     } 

     var query2 = from file in files2 
        where (!file.Attributes.HasFlag(FileAttributes.Hidden)) 
        select (file.Name); 
     foreach (var file in query2) 
     { 
      FileList2.Add(file); 
     } 

     var FilesRemaining = FileList1.Except(FileList2).ToList(); 

     foreach (var file in FilesRemaining) 
     { 
      string fullFile = Path.GetFullPath(file); 
      CompareFileList.Add(fullFile); 
      Console.WriteLine(fullFile); 
     } 

     return CompareFileList; 

    } 
+0

あなたはFileList1&2 '一覧を作り、'してから 'Except'呼び出しのローカル等価演算子を使用したほうが良いだろうように思える:https://msdn.microsoft.com/en-us /library/bb300779(v=vs.110).aspxそして、最後にループのマイナーな調整をします。 – zzxyz

+0

実際には、Exceptの代わりにWhereの呼び出ししかできませんでした。 – zzxyz

答えて

3

これを使用すると、オブジェクトのFileInfoあなたを保持し、まだだけ自分の名前を使用してリストを除いて計算することができます。

//More efficient way to get your files. 
IEnumerable<FileInfo> files1 = directory1 
    .GetFiles("*.*", SearchOption.TopDirectoryOnly) 
    .Where(x => !x.Attributes.HasFlag(FileAttributes.Hidden)); 
IEnumerable<FileInfo> files2 = directory2 
    .GetFiles("*.*", SearchOption.TopDirectoryOnly) 
    .Where(x => !x.Attributes.HasFlag(FileAttributes.Hidden)); 

//It uses the FileNameComparer class to compare to values. 
IEnumerable<FileInfo> filesRemaining = files1.Except(files2, new FileNameComparer()); 

ここではFileNameComparerクラスです。

public class FileNameComparer : IEqualityComparer<FileInfo> 
{ 
    public bool Equals(FileInfo x, FileInfo y) 
    { 
     //Here is where the magic is happening. 
     return x.Name == y.Name; 
    } 

    //You need this too, altougt, I am not quite sure when it gets used. 
    public int GetHashCode(FileInfo obj) 
    { 

     return obj.Name.GetHashCode(); 
    } 
} 
+0

@Steveどういうことを言っていますか?これはうまくコンパイルされます。あなたがLINQの構文を使用する場合は、あなたがする必要がありますが、私はそうではありません – rokkerboci

+0

右、寝るに行く時間 – Steve

+0

@スティーブ私もそこにされている友人。 :D – rokkerboci

-1
class Program 
{ 
    static void Main(string[] args) 
    { 
     foreach (var f in CompareFiles(@"x:\tmp\dir_1", @"x:\tmp\dir_2")) 
     { 
      Console.WriteLine(f); 
     } 

     Console.ReadKey(); 
    } 

    public static List<string> CompareFiles(string comparePath1, string comparePath2) 
    { 
     //Queries the given directory for filenames 
     var fileList1 = (from file in new DirectoryInfo(comparePath1).GetFiles("*.*", SearchOption.TopDirectoryOnly) 
         where !file.Attributes.HasFlag(FileAttributes.Hidden) 
         select file.Name).ToList(); 

     var fileList2 = (from file in new DirectoryInfo(comparePath2).GetFiles("*.*", SearchOption.TopDirectoryOnly) 
         where !file.Attributes.HasFlag(FileAttributes.Hidden) 
         select file.Name).ToList(); 
     return fileList1.Except(fileList2) 
         .Select(file => Path.Combine(comparePath1, file)) 
         .ToList(); 
    } 
} 
+0

誰かがこれを落とした理由は不思議ですか?それは妥当な答えのように見えます。 – zzxyz

+0

わかりませんが、この解決策を試してみませんでしたが、もう1つは私のために働いた。 –

関連する問題