2011-06-09 21 views
4

我有一個WPF中的列表框,它自動獲取框中列出的文件的FullName,然後將這些文件添加到其特定文件夾下的Zip。C#從一個路徑到一個點獲取所有父目錄?

例如:

C:\ PROGRAMFILES \ Folder1中\ FOLDER2 \ Folder3 \ Folder4 \ file.txt的

我需要能夠將其拉鍊成其夾到一個特定的文件夾中,如只有

\文件夾2 \ Folder3 \ Folder4 \ file.txt的

我怎麼能這樣做?我嘗試過獲取父目錄,但它只返回文件所在的目錄。

回答

3

您可以使用DirectoryInfo對象將父級鏈接到您需要的鏈上。如果你想獲得一個父目錄三個級別了,你可以做這樣的事情:

DirectoryInfo di = new DirectoryInfo(@"C:\ProgramFiles\Folder1\Folder2\Folder3\Folder4\file.txt"); 
     for(int i = 0; i<3; i++){ 
      di = di.Parent; 
     } 

很明顯,你可以改變你如何停止你的穿越,滿足您的需求。在你需要它的DirectoryInfo對象之後,你可以做你所需要的。我假設你將需要完整的路徑或使用目錄對象。要獲取完整路徑,請使用FullName屬性。例如,如果你想在目錄中的所有文件,你可以做到以下幾點:

string[] fileNames = Directory.GetFiles(di.FullName); 
+0

這將是可能的,要求規範的X量的路徑,我的意思是有可能得到的所有父文件夾除C:\ ProgramFiles之外的所有其他名稱。像file1.txt需要去Folder1,而file2.txt只需要去Folder2,但是你不一定知道在添加新路徑時需要走多遠。 (我正在製作的程序是一個autopatch .zip製作程序,它將舊文件列表與新文件進行比較,並將新文件壓縮成一個補丁。)如果你明白我想說什麼。 – Dan 2011-06-09 02:07:41

+0

在這種情況下,你知道你想要考慮你的根文件夾嗎?如果是這樣,那麼它只是一個使用while循環而不是for的問題,並且直到你到達路徑時纔會考慮根路徑。所以它會像:while(di.FullName!= @「C:\ ProgramFiles」){di = di.Parent;}。這會讓你得到你想要的還是我誤解了一些東西?或者你不知道你的根目錄?如果這樣,顯然不會工作。 – 2011-06-09 02:26:03

+0

工作。謝謝! – Dan 2011-06-09 02:40:30

0
private static IEnumerable<DirectoryInfo> GetAllParentDirectories(DirectoryInfo directoryToScan) 
    { 
     Stack<DirectoryInfo> ret = new Stack<DirectoryInfo>(); 
     GetAllParentDirectories(directoryToScan, ref ret); 
     return ret; 
    } 

    private static void GetAllParentDirectories(DirectoryInfo directoryToScan, ref Stack<DirectoryInfo> directories) 
    { 
     if (directoryToScan == null || directoryToScan.Name == directoryToScan.Root.Name) 
      return; 

     directories.Push(directoryToScan); 
     GetAllParentDirectories(directoryToScan.Parent, ref directories); 
    } 
相關問題