C# 在进一步与学员合作之前,确定学员的能力
我编写了一个shell扩展,它对文件夹中的文件进行排序。我的结构是,对于所有类型的文件,都有自己的类,其中我有自定义的内部方法进行排序 所有类中都有扩展名为字符串类型的列表。问题是我不知道如何定义类型文件作为创建适当对象并继续排序的第一步。(编辑:即哪个类应该对哪个文件类型进行排序。) 首先这是主排序,我们得到一个目录中的所有文件,然后取一个文件并检查它,如果它属于现有的文件类型之一,那么我们应该使用属于适当类的排序方法。 我无法修复的时刻是“检查它,如果它属于现有的文件类型之一” 文件类型以单独的类表示。所以,对于jpeg或png,我有一个类Graphics,这个类包含二次排序,但首先我们需要知道文件属于Graphics 现在我做了这样的排序,只是在start中创建对象,然后检查C# 在进一步与学员合作之前,确定学员的能力,c#,.net,C#,.net,我编写了一个shell扩展,它对文件夹中的文件进行排序。我的结构是,对于所有类型的文件,都有自己的类,其中我有自定义的内部方法进行排序 所有类中都有扩展名为字符串类型的列表。问题是我不知道如何定义类型文件作为创建适当对象并继续排序的第一步。(编辑:即哪个类应该对哪个文件类型进行排序。) 首先这是主排序,我们得到一个目录中的所有文件,然后取一个文件并检查它,如果它属于现有的文件类型之一,那么我们应该使用属于适当类的排序方法。 我无法修复的时刻是“检查它,如果它属于现有的文件类型之一” 文件类型以单
public void PrimarySorting(string folderPath)
{
var allFiles = Directory.GetFiles(folderPath, "*.*", SearchOption.TopDirectoryOnly).ToList();
while (allFiles.Count != 0)
{
allFiles = Directory.GetFiles(folderPath, "*.*", SearchOption.TopDirectoryOnly).ToList();
foreach (var file in allFiles)
{
var directoryName = new DirectoryInfo(folderPath).Name;
var fileType = Path.GetExtension(file);
var sourcePath = file;
//var destinationPath = folderPath + "/" + area + directoryName + "/" + fileName;
char[] toRemoveFromExtensionString = {'.', '"'};
if (fileType != null)
{
var extensionLikeSymbols = fileType.Trim(toRemoveFromExtensionString).ToLower();
var gr = new Graphics();
var arc = new Archive();
if (
gr.ColorManagement.Union(gr.ColorPalettes)
.Union(gr.RasterGraphics)
.Union(gr.VectorGraphics)
.Union(gr.ThreeDimensionalGraphics)
.Contains(extensionLikeSymbols))
{
var objectToCallMethod = new Graphics();
objectToCallMethod.CustomSortForParticularArea(extensionLikeSymbols, file,
folderPath, objectToCallMethod, sourcePath, directoryName);
}
else if (
arc.Compressed.Union(arc.PhysicalRecordableMediaArchives)
.Contains(extensionLikeSymbols))
{
var objectToCallMethod = new Archive();
;
objectToCallMethod.CustomSortForParticularArea(extensionLikeSymbols, file,
folderPath, objectToCallMethod, sourcePath, directoryName);
}
}
}
}
}
我仍然不确定你的问题是否正确,但我试着回答 我在源代码中看到,为了处理图像和归档文件,您演示了图形和归档类 您可以为类提供公共祖先,比如FileTypeBase,它将包含虚拟(静态)方法
SupportedExtensions()
返回受支持扩展的数组(或列表)。然后从该类继承类图形和存档。在图形类中,实现该方法,使其返回包含“jpeg”、“png”的列表。Archive类中的相同方法将返回“zip”、“rar”
等,您明白了
然后在main方法中,您可以对已知的类调用此方法,并通过这种方式确定哪个类服务器有哪些扩展(以及是否已将其实例化等)。我仍然不确定您的问题是否正确,但我尝试回答 我在源代码中看到,为了处理图像和归档文件,您演示了图形和归档类 您可以为类提供公共祖先,比如FileTypeBase,它将包含虚拟(静态)方法
SupportedExtensions()
返回受支持扩展的数组(或列表)。然后从该类继承类图形和存档。在图形类中,实现该方法,使其返回包含“jpeg”、“png”的列表。Archive类中的相同方法将返回“zip”、“rar”
等,您明白了
然后,在main方法中,您可以对已知的类调用此方法,并通过这种方式确定哪个类服务器有哪些扩展(以及是否已将其实例化等)。很难找到好的答案,因为我还没有看到
Graphics
和Archive
的源代码,不过我还是会试试的
据我所知,Graphics
和Archive
都有CustomSortForParticularArea
方法,可以发挥所有的魔力。它搜索具有指定扩展名的文件并将其移动到相应的文件夹。(为了复制文件,我不确定是否需要为每个“扩展组”指定一个专用类。我假设图形和存档除了复制文件之外,还需要做其他事情。)
我还了解到,您需要创建两个对象,而不是一个。例如,如果它是一个“png”文件,那么该应用程序将创建图形
和存档
对象。显然,这不是一个好办法,因为您希望使用适当类的对象。您的问题有多种解决方案。当Graphics
和Archive
不知道文件扩展名,并且对象初始化被委托给另一个类(例如工厂)时,我将只解释其中的一个
这是“分类器”类的基类。它可以实现可在子类中重用的逻辑和/或为子类定义要实现的协议。它可能是一个常规类,一个具有将被重写的虚拟方法的类,一个抽象类,或者您可以使用接口而不是类。由你来决定。其主要思想是有一个表示图形
和存档
的抽象,或者有一个必须由图形
和存档
实现的协议。为了简单起见,我将使用普通类
public class BespokeFileSorter
{
public void CustomSortForParticularArea(string extensionLikeSymbols, string file, string folderPath, string sourcePath, string directoryName)
{
// finds file(s) with expention(s) in folder(s) and copies them to filder(s)
}
// other methods
}
Graphics
和Archive
已经知道如何查找和复制文件,因为它们是BespokeFileSorter的子类(或继承)
public class Graphics : BespokeFileSorter
{
// other methods
}
public class Archive : BespokeFileSorter
{
// other methods
}
这是一家负责创建“分拣机”的工厂。它是唯一一个根据提供的信息知道要创建什么对象的类。您需要选择工厂用来决定创建什么对象所需的最小数据。我想一个文件扩展名就足够了。因此,如果您传递“png”,它将创建一个类型为Graphics
的对象。如果您通过“iso”,它将创建一个类型为Archive
的对象。无论如何,它将返回BespokeFileSorter
。如果你在理解它的工作原理方面有困难,我建议你阅读OOP
public static class BespokeFileSorterFactory
{
private static HashSet<string> supportedGraphicExtensions = new HashSet<string>
{
"jpeg", "png" // Raster, vector, 3D, etc. graphics
};
private static HashSet<string> supportedArchiveExtensions = new HashSet<string>
{
"ison", "nrg" // and others
};
public static BespokeFileSorter Create(string fileExtension)
{
if (supportedGraphicExtensions.Contains(fileExtension))
return new Graphics();
if (supportedArchiveExtensions.Contains(fileExtension))
return new Archive();
throw new NotSupportedException("Unknown file extension");
}
}
您的代码还可以进行其他改进。您可以为类(-es)创建一个缓存(Graphics
和Archive
正在每个迭代中创建)。您还可以重构联合和包含,我相信这会使您的域模型复杂化。要记住的最重要的一点是,你应该让你的班级保持小规模,让他们只负责一些事情。如果您需要一个类来复制文件,那么就创建一个这样做的类,而不向其添加额外的职责/可能是一个坏例子,因为.NET得到了它/提示:Google for SOLID principle
var bespokeFileSorter = BespokeFileSorterFactory.Create(extensionLikeSymbols);
bespokeFileSorter.CustomSortForParticularArea(extensionLikeSymbols, file, folderPath, sourcePath, directoryName);