C# 为什么它会生成更新的文件,而不是正确地移动副本? private void按钮4\u单击(对象发送者,事件参数e) { FileStream outputFileStream=newfilestream(“log.txt”,FileMode.Create,FileAccess.Write); StreamWriter writer=新的StreamWriter(outputFileStream); //书写块 字符串originalPathFile=@“C:\Users\user\Downloads\CaptchaCollection\Small\”; 字符串duplicatePath=@“C:\Users\user\Downloads\CaptchaCollection\Small\Duplicates\”; 字符串movedOriginal=@“C:\Users\user\Downloads\CaptchaCollection\Small\Sorted\”; var files=Directory.GetFiles(originalPathFile) .Select(nameWithExtension=>Path.GetFileNameWithoutExtension(nameWithExtension)) .Where(name=>{int number;返回int.TryParse(name,out number);}) .Select(name=>int.Parse(name)) .OrderBy(number=>number).ToArray(); while(files.Length>1) { 字符串DuplicateOffFolder=Directory.CreateDirectory(duplicatePath+文件[0].ToString()).FullName; 对于(int j=1;jPath.GetFileNameWithoutExtension(nameWithExtension)) .Where(name=>{int number;返回int.TryParse(name,out number);}) .Select(name=>int.Parse(name)) .OrderBy(number=>number).ToArray(); } writer.Close(); outputFileStream.Close(); }
所以这个按钮基本上在视觉上移动图像的复制文件。我从我之前问过的一个问题中得到了这个代码。现在我想使用一个新文件夹来放置特定图像的副本 例如: 1.png有5个视觉副本(65.png、87.png、100.png、103.png、156.png)。我想将所有副本移动到此目录,而不是将其放在C# 为什么它会生成更新的文件,而不是正确地移动副本? private void按钮4\u单击(对象发送者,事件参数e) { FileStream outputFileStream=newfilestream(“log.txt”,FileMode.Create,FileAccess.Write); StreamWriter writer=新的StreamWriter(outputFileStream); //书写块 字符串originalPathFile=@“C:\Users\user\Downloads\CaptchaCollection\Small\”; 字符串duplicatePath=@“C:\Users\user\Downloads\CaptchaCollection\Small\Duplicates\”; 字符串movedOriginal=@“C:\Users\user\Downloads\CaptchaCollection\Small\Sorted\”; var files=Directory.GetFiles(originalPathFile) .Select(nameWithExtension=>Path.GetFileNameWithoutExtension(nameWithExtension)) .Where(name=>{int number;返回int.TryParse(name,out number);}) .Select(name=>int.Parse(name)) .OrderBy(number=>number).ToArray(); while(files.Length>1) { 字符串DuplicateOffFolder=Directory.CreateDirectory(duplicatePath+文件[0].ToString()).FullName; 对于(int j=1;jPath.GetFileNameWithoutExtension(nameWithExtension)) .Where(name=>{int number;返回int.TryParse(name,out number);}) .Select(name=>int.Parse(name)) .OrderBy(number=>number).ToArray(); } writer.Close(); outputFileStream.Close(); },c#,file,create-directory,C#,File,Create Directory,所以这个按钮基本上在视觉上移动图像的复制文件。我从我之前问过的一个问题中得到了这个代码。现在我想使用一个新文件夹来放置特定图像的副本 例如: 1.png有5个视觉副本(65.png、87.png、100.png、103.png、156.png)。我想将所有副本移动到此目录,而不是将其放在duplicates目录:C:\Users\user\Downloads\CaptchaCollection\Small\duplicates\1\ 现在发生的是,它显然正在重命名和重新生成一些图像。我无法用语言
duplicates
目录:C:\Users\user\Downloads\CaptchaCollection\Small\duplicates\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();
}
实际上,您正在将第一个文件与其他文件进行比较,但仍在复制重复文件夹中的文件
替换以下行
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");
}
与
这应该行。要将5个同名“1.png”的文件复制到同一个目录中吗?这就是你说的吗?@TMcKeown是的,没错。嗯,它们是用不同的名字复制的。我不明白你的答案。你知道目录中的每个文件都必须有一个唯一的名称,对吗?@TMcKeown你是什么意思?当我检查每个原始文件时,名称会更改。因此,如果我转到
2.png
并找到3个副本,它将移动并创建一个名为2
的新文件夹。因此,基本上它是使用外循环根据“原始”图像名称生成文件的。如果您转到2.png
并找到3个副本,然后创建一个名为2
的新文件夹,您仍然无法将3个名为2.png
的文件放在该文件夹中。您具体想对这3个重复文件做什么?我应该将原始文件的重复文件移动到创建的新文件夹中,而不是原始文件。只检查了编辑,但找不到目录:(我已经编辑了我的答案。您忘记在duplicates文件夹中创建具有原始文件名的子文件夹。这应该是问题的原因。您应该在移动文件之前创建目录。我还添加了创建目录的代码并修改了答案。您需要在调试器中签入,数组中存储的文件名是什么你们从linq查询中得到了什么。否则我建议的代码看起来还可以。
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");