2016-07-06 10 views
0

我寫了一個shell擴展,它對文件夾中的文件進行排序。我有的結構是,對於所有類型的文件都有自己的類,我有自定義的內部方法進行排序。在進一步使用它們之前確定類的能力

在所有類中都是帶有字符串類型擴展名的列表。問題是我不知道如何定義第一步的類型文件來創建適當的對象並繼續排序。 (編輯:即哪個類應該排序哪種文件類型)

首先這是主排序,我們獲取目錄中的所有文件,然後我們取一個文件並檢查它,如果它屬於一個現有的文件類型,那麼我們應該使用屬於適當類的排序方法。 我不能修復的時刻是「檢查它,如果它屬於現有的文件類型之一」。

文件類型是作爲一個單獨的類呈現的。所以,對於JPEG或PNG,我有類圖形,這個類包含二次排序,但首先我們需要知道該文件屬於圖形。

現在,我做了這樣的排序是這樣的,只是在創建對象開始,然後檢查

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); 
         } 
        } 
       } 
      } 

    } 
+6

請用文字替換代碼圖片。 – adv12

+0

在.NET代碼中的實際ShellExtension不明智:[實現進程內擴展的指導](https://msdn.microsoft.com/en-us/library/windows/desktop/dd758089(v = vs.85) .aspx)即:** Microsoft建議不要將託管的進程內擴展編寫到Windows資源管理器或Windows Internet Explorer,並且不會將其視爲受支持的方案。** – Plutonix

+0

@Plutonix我寫如果只是爲了讓自己更深入地學習代碼,那麼這對我來說就是我,而不是生意上的事。 – whoiskatrin

回答

1

很難想出一個好的答案,因爲我還沒有看到GraphicsArchive的源代碼,但我會盡量嘗試。

據我所知,GraphicsArchive都有CustomSortForParticularArea的方法,它所有的魔法。它搜索具有指定擴展名的文件並將它們移動到適當的文件夾中。 (我不確定你是否需要爲每個「擴展組」設置一個專門的課程以便複製文件,我假設GraphicsArchive除了複製文件之外還有其他一些功能。)

我已經也理解是你需要創建兩個對象而不是一個。例如,如果它是一個「PNG」文件,那麼應用程序將創建GraphicsArchive對象。很顯然,這不是要走的路,因爲你想使用適當類的對象。您的問題有多種解決方案。當GraphicsArchive不知道文件擴展名並將對象啓動委託給另一個類(例如工廠)時,我將解釋其中的一個。

這是您的「分揀機」類的基類。它可以實現可以在子類中重用的邏輯和/或它可以爲子類實現一個協議。它可能是一個普通類,一個虛擬方法將被重寫的類,一個抽象類,或者你可以使用一個接口而不是一個類。這取決於你自己決定。主要思想是具有代表GraphicsArchive或具有必須由GraphicsArchive執行的協議的抽象。爲了簡單起見,我將使用普通類。

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 
} 

GraphicsArchive已經知道如何找到並複製文件,因爲它們繼承(或繼承)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"); 
    } 
} 

最後,在你的代碼的某個地方你可以做類似的事情。將文件擴展名傳遞給工廠,並讓它決定要創建哪個對象。調用新建對象的所需方法來查找和複製文件。

var bespokeFileSorter = BespokeFileSorterFactory.Create(extensionLikeSymbols); 
bespokeFileSorter.CustomSortForParticularArea(extensionLikeSymbols, file, folderPath, sourcePath, directoryName); 

還有其他可以對您的代碼進行的改進。您可以爲類(-es)創建緩存(每個迭代中都會創建GraphicsArchive)。你也可以重構工會包含,我認爲這會讓你的域模型複雜化。最重要的是要記住,你應該讓你的課程小一些,並讓他們只對一些事情負責。如果你需要一個複製文件的類,那麼就創建一個類來完成它,並且不會增加額外的責任。 /可能是一個不好的例子,因爲.NET得到它/提示:谷歌的SOLID原則。

+0

謝謝,那正是我想聽到的解釋!一切都很清楚,我用你的建議重建我的代碼,一切正常。 – whoiskatrin

+0

我很高興我能夠幫助你。 –

1

我還不太確定我是否有你的問題的權利,但我儘量回答。

我看到,在源代碼中,您演示了圖形和歸檔類以處理圖像和歸檔文件。

你可以給你的類共同的祖先,如FileTypeBase將包含虛擬(靜態)方法SupportedExtensions()返回受支持的擴展數組(或列表)。然後從這個類繼承你的類Graphics和Archive。在Graphics類中,實現該方法,以便它返回包含「jpeg」,「png」的列表。存檔類的同樣的方法將返回"zip","rar"等,你明白了。

然後在你的主要方法中,你可以在已知的類上調用這個方法,這樣就可以確定哪個類的服務器使用哪些擴展(以及是否已經實例化了)。

+0

它看起來像是非常接近解決方案,但是您能否解釋主類中SupportExtensions()方法的調用,我不明白應該如何使用它來選擇類?感謝您試圖解決這個問題。 – whoiskatrin

+0

@whoiskatrin - 你熟悉C#中的類繼承嗎? – miroxlav

+0

是的,我這樣做,我知道該怎麼做,我不明白如何工作的方法從主要 – whoiskatrin

相關問題