1
private void button4_Click(object sender, EventArgs e)
{
    FileStream outputFileStream = new FileStream("log.txt", FileMode.Create, FileAccess.Write);
    StreamWriter writer = new StreamWriter(outputFileStream);

    // writing block

    string originalPathFile = @"C:\Users\user\Downloads\CaptchaCollection\Small\";
    string duplicatePath = @"C:\Users\user\Downloads\CaptchaCollection\Small\Duplicates\";
    string movedOriginal = @"C:\Users\user\Downloads\CaptchaCollection\Small\Sorted\";

    var files = Directory.GetFiles(originalPathFile)
                            .Select(nameWithExtension => Path.GetFileNameWithoutExtension(nameWithExtension))
                            .Where(name => { int number; return int.TryParse(name, out number); })
                            .Select(name => int.Parse(name))
                            .OrderBy(number => number).ToArray();

    while (files.Length > 1)
    {
        string duplicateOfFolder = Directory.CreateDirectory(duplicatePath + files[0].ToString()).FullName;

        for (int j = 1; j < files.Length; j++)
        {
            Bitmap im1 = new Bitmap(originalPathFile + files[0].ToString() + ".png");
            Bitmap im2 = new Bitmap(originalPathFile + files[j].ToString() + ".png");

            if (compare(im1, im2))
            {
                File.Move(originalPathFile + files[j].ToString() + ".png", duplicateOfFolder + files[j].ToString() + ".png");
                writer.WriteLine(files[j].ToString() + ".png" + " is a duplicate of " + files[0].ToString() + ".png \n");
            }
        }

        File.Move(originalPathFile + files[0].ToString() + ".png", movedOriginal + files[0].ToString() + ".png");
        writer.WriteLine(files[0].ToString() + ".png " + "has had its duplicates removed.");

        files = Directory.GetFiles(originalPathFile)
                            .Select(nameWithExtension => Path.GetFileNameWithoutExtension(nameWithExtension))
                            .Where(name => { int number; return int.TryParse(name, out number); })
                            .Select(name => int.Parse(name))
                            .OrderBy(number => number).ToArray();
    }

    writer.Close();
    outputFileStream.Close();
}

したがって、このボタンは基本的に画像の重複ファイルを視覚的に移動します。このコードは、以前に尋ねた質問の 1 つから取得しました。ここで、新しいフォルダーを使用して、特定の画像の複製を配置したいと考えています。

例: 1.png には 5 つの視覚的な重複があります (65.png、87.png、100.png、103.png、156.png)。ディレクトリに配置するだけでなく、すべての重複をこのディレクトリに移動したいDuplicatesC:\Users\user\Downloads\CaptchaCollection\Small\Duplicates\1\

代わりに、いくつかの画像の名前を変更して再生成しているようです。何が起こっているのかを実際に見ることができないため、これを言葉で説明することはできません。発生していないのは、これらのファイルが重複ファイル編成のディレクトリに移動されていないことです。

フォルダーは作成されますが、代わりに適切なフォルダーに配置されません。

4

1 に答える 1

1

あなたの要件を正しく理解していれば、問題は次の行にあると思います。

if (compare(im1, im2))
{
    File.Move(originalPathFile + files[j].ToString() + ".png", duplicateOfFolder + files[j].ToString() + ".png");
    writer.WriteLine(files[j].ToString() + ".png" + " is a duplicate of " + files[0].ToString() + ".png \n");
}

実際には最初のファイルを他のファイルと比較していますが、ファイルを重複フォルダーにコピーしています。

次の行を置き換えます

File.Move(originalPathFile + files[j].ToString() + ".png", duplicateOfFolder + files[j].ToString() + ".png");

String path = duplicateOfFolder;
if (!Directory.Exists(path)) 
{
   Directory.CreateDirectory(path);
}

File.Move(originalPathFile + files[j].ToString() + ".png", path + "\\" + files[j].ToString() + ".png");

これはうまくいくはずです。

于 2014-01-26T06:05:45.783 に答える