文件从第一级和第二级文件夹复制两次



我找到并重新编写了以下代码以满足我的需要。该代码将所有电子表格从源文件夹复制到基于电子表格文件扩展名枚举的新文件夹。

但是,如果文件位于第一级的源文件夹或子文件夹中,它会复制两次文件(bug!)。在第二级或第三级的任何其他子文件夹只复制一次。

是什么bug?

的第二个问题,你看到在枚举代码跳过目录。我曾经尝试过删除这段代码,因为它似乎并不必要,和删除的代码不会影响结果。有必要吗?

string argument1 = @"C:Test";
string convert_directory = @"C:Test";
// The input and output directory must be identical for the error to happen

if (argument3 == "Recursive=Yes")
{
var extensions = new List<string> { ".fods", ".ods", ".ots", ".xls", ".xlt", ".xlam", ".xlsb", ".xlsm", ".xlsx", ".xltm", ".xltx" };
// Create enumeration that only includes spreadsheet file extensions
var enumeration = new FileSystemEnumerable<FileSystemInfo>(argument1,(ref FileSystemEntry entry) => entry.ToFileSystemInfo(),new EnumerationOptions() { RecurseSubdirectories = true })
{
ShouldIncludePredicate = (ref FileSystemEntry entry) =>
{

// Skip directories (is this necessary?)
if (entry.IsDirectory)
{
return false;
}
// End of skip directories
foreach (string extension in extensions)
{
var fileExtension = Path.GetExtension(entry.FileName);
if (fileExtension.EndsWith(extension, StringComparison.OrdinalIgnoreCase))
{
// Include the file if it matches extensions
return true;
}
}
// Doesn't match, exclude it
return false;
}
};
// Copy spreadsheets based on enumeration
foreach (var file in enumeration)
{
// Rename new copy
int copy_file_number = 1;
string new_filepath = convert_directory + "\" + copy_file_number + file.Extension;
while (File.Exists(new_filepath))
{
copy_file_number++;
new_filepath = convert_directory + copy_file_number + file.Extension;
}
// Copy
File.Copy(file.FullName, new_filepath);
}

输入和输出文件夹相同。

因此需要在开始实际复制之前缓存要复制的文件列表。只需更改foreach行即可。

在循环之间保持copy_file_number似乎也是明智的,这样你就不必一直检查相同的文件。

int copy_file_number = 1;
foreach (var file in enumeration.ToList())
{
// Rename new copy
string new_filepath = Path.Combine(convert_directory, copy_file_number + file.Extension;
while (File.Exists(new_filepath))
{
copy_file_number++;
new_filepath = Path.Combine(convert_directory, copy_file_number + file.Extension);
}
// Copy
File.Copy(file.FullName, new_filepath);
}

感谢@marsze重新检查我的代码并确认它可以工作。这让我对调试有了更多的思考

我使用了与输出目录相同的输入目录。然后这个错误发生了。如果目录不同,则不会。理想情况下,这应该不是一个问题,因为文件应该只复制一次,而不管它们在哪个文件夹级别。

但我的解决方案将确保输入和输出参数不能是相同的。

相关内容

  • 没有找到相关文章