2011-04-13 36 views
1

的Visual Studio模板具有文件夾結構是這樣的:找到最低的子文件夾和壓縮它們

/ProjectTemplatesCache 
    /CSharp 
     /Windows 
      /1033 
       /ClassLibrary.zip -- the lowest subfolder 
        /Properties 
       /WindowsService.zip -- the lowest subfolder 
      /1042 
    /VisualBasic 

我想在根文件夾開始,向下挖掘到最低的子文件夾和壓縮他們每個人單獨的存檔。

使用Windows批處理或C#。

如何zip - 無所謂。只要能夠分別選擇每個/執行一個命令。

任何想法?

+0

是否「最低」意味着它不包含子文件夾?另外,是否有任何命名約定可以幫助獲取文件夾層次結構? – khachik 2011-04-13 09:43:21

+0

@khachik:好問題!謝謝。我認爲最低的是名爲「* .zip」(仍然是一個文件夾) – abatishchev 2011-04-13 09:51:54

回答

3

C#4.0:

var leafsDirs = Directory 
    .EnumerateDirectories(Directory.GetCurrentDirectory(), "*", SearchOption.AllDirectories) 
    .Where(sub => !Directory.EnumerateDirectories(sub).Any()); 

leafsDirs.ToList().ForEach(Console.WriteLine); 

ICSharpZip做實際荏苒

更新

@ khachik的建議後,我的標準應該是di.Name.EndsWith( 「.zip」,StringComparison.OrdinalIgnoreCase)

確定,只是混合的條件與Where()

儘可能模板文件夾可以包含一些子文件夾,例如ASP.NET MVC的Web應用程序

可以隨時提供Func<DirectoryInfo, bool>決定哪些目錄toBeZipped

1

如果使用那麼C#:

...和如果你真的想要un zip,然後嘗試Unzip files programmatically in .net

+0

謝謝。歸檔我不能調用'Process.Start(「winrar.exe」,args)'。我的主要問題不是如何枚舉子文件夾,而是如何找到最低的文件夾。 – abatishchev 2011-04-13 09:47:56

+0

您可以通過遞歸枚舉找到最低的那個(「葉子」目錄),直到您找到一個沒有更多子目錄的目錄。 – Stuart 2011-04-13 09:50:24

1

所以,你基本上wa nt查找所有沒有子目錄的子目錄?

var root = new DirectoryInfo(startPath); 
var lowestSubFolders = 
    root.EnumerateDirectories("*", SearchOption.AllDirectories) 
     .Where(di => di.EnumerateDirectories().Count() == 0); 

當然會有問題,如果存在對當前用戶沒有訪問及該子目錄,但給我的感覺,這個代碼是一些方便的工具,將在受控環境中操作。

+2

喜歡的思想...然而,使用!。Any()擊敗.Count()== 0特別是對於大/很多目錄 – sehe 2011-04-13 09:55:20

+0

@sehe:非常好的一點。爲什麼我沒有想到這個? – 2011-04-13 09:56:39

+0

在@ khachik的建議之後,我的標準似乎是'di.Name.EndsWith(「。zip」)',只要模板文件夾可以包含一些子文件夾,例如。 ASP.NET MVC網絡應用程序 – abatishchev 2011-04-13 09:57:00

1

以下代碼以遞歸方式遍歷目錄樹。您應該能夠使用它作爲你的代碼的基礎:

void WalkDirectoryTree(System.IO.DirectoryInfo root) 
{ 
    System.IO.FileInfo[] files = null; 
    System.IO.DirectoryInfo[] subDirs = null; 


    // First, process all the files directly under this folder 
    try 
    { 
     files = root.GetFiles("*.*"); 
    } 
    // This is thrown if even one of the files requires permissions greater 
    // than the application provides. 
    catch (UnauthorizedAccessException e) 
    { 
    } 
    catch (System.IO.DirectoryNotFoundException e) 
    { 
    } 

    if (files != null) 
    { 
     foreach (System.IO.FileInfo fi in files) 
     { 

     } 

     // Now find all the subdirectories under this directory. 
     subDirs = root.GetDirectories(); 


     foreach (System.IO.DirectoryInfo dirInfo in subDirs) 
     { 
     // Resursive call for each subdirectory. 
     WalkDirectoryTree(dirInfo); 
     } 
    } 
} 

你可以只返回一個布爾值,如果沒有更多的目錄下去,然後壓縮所有文件。

相關問題