2017-06-28 141 views
-3

我想查找一個函數來查找包含一組文件和文件夾的文件夾。例如,對於文件的集合如下:c#代碼找到包含一組文件和子文件夾的文件夾

C:\Users\Simon\Documents\TestFolder\File.doc 
C:\Users\Simon\Documents\TestFolder\File2.doc 
C:\Users\Simon\Documents\TestFolder\Subfolder1\File.doc 
C:\Users\Simon\Documents\TestFolder\Subfolder1\Subfolder2\File.doc 
C:\Users\Simon\Documents\TestFolder\Subfolder1\Subfolder2\Subfolder3 

該函數將返回該文件夾

C:\Users\Simon\Documents\TestFolder 

而對於集合

C:\Users\Simon\Documents\File.doc 
C:\Users\Simon\Documents\TestFolder\File.doc 
C:\Users\Simon\Documents\TestFolder\File2.doc 
C:\Users\Simon\Documents\TestFolder\Subfolder1 

函數將返回:

C:\Users\Simon\Documents 

在th在沒有公用文件夾的情況下,例如:

Z:\Backup\File.doc 
C:\Users\Simon\Documents\TestFolder\File.doc 
C:\Users\Simon\Documents\TestFolder\File2.doc 
C:\Users\Simon\Documents\TestFolder\Subfolder1\File.doc 
C:\Users\Simon\Documents\TestFolder\Subfolder1\Subfolder2\File.doc 

該函數將返回null。有沒有人有這樣的功能?

+2

我懷疑是否有現有的功能。您可能必須自己實現它 – Fabiano

回答

1

很久以前我一直在尋找這一點,本想出了:

public string GetCommonPath(string[] paths) 
{ 
    if (paths == null || !paths.Any()) return string.Empty; 
    var first = paths.OrderBy(x => x.Length).First(); 
    var common = first.Substring(0, Enumerable.Range(0, first.Length) 
     .Reverse() 
     .FirstOrDefault(x => paths.All(line => line.Length > x && line.StartsWith(first.Substring(0, x))))); 
    var lastChar = common.LastIndexOf(@"\"); 
    if (lastChar > -1) 
     common = common.Substring(0, lastChar); 
    return common; 
} 
+0

當此函數獲取單個文件夾作爲參數時,它將取消最後一個文件夾元素。適用於單個文件。 – SimonKravis

0

這是我做長篇大論的代碼,在路徑限制爲40個元素:

/// <summary> 
    /// Finds common folder for a string array of file and folder paths. 
    /// eg for input 
    ///   C:\Users\Simon\Documents\File.doc 
    ///   C:\Users\Simon\Documents\TestFolder\File.doc 
    ///   C:\Users\Simon\Documents\TestFolder\File2.doc 
    ///   C:\Users\Simon\Documents\TestFolder\Subfolder1 
    ///   
    /// Output is 
    ///   C:\Users\Simon\Documents 
    /// </summary> 
    /// <param name="Selection"> array of paths</param> 
    /// <returns>common folder path or null if none</returns> 
    private string FindCommonFolder(string[] Selection) 
    { 

     string[] SplitItem; 
     List<string[]> ItemList = new List<string[]>(); 
     foreach (string Item in Selection) 
     { 
      string[] ItemElements = new string[40]; 
      SplitItem = Item.Split('\\'); 
      int i = 0; 
      foreach (string Element in SplitItem) 
      { 
       ItemElements[i] = Element; 
       i++; 
      } 
      ItemList.Add(ItemElements); 
     } 

     string sCommonFolder = ""; 
     for (int i = 0; i < 39; i++) 
     { 
      string Element = ItemList[0][i]; 

      if (Element != null) 
      { 
       foreach (string[] ListElements in ItemList) 
       { 
        if (ListElements[i] != Element) 
        { 
         if (i == 0) return null; 
         else return sCommonFolder.Substring(0, sCommonFolder.Length - 1); 
        } 
       } 
       sCommonFolder += Element + '\\'; 
      } 
     } 
     string sResult = sCommonFolder.Substring(0, sCommonFolder.Length - 1); 
     if(Directory.Exists(sResult)) return sResult; 
     else return Path.GetDirectoryName(sResult); 

    } 
相關問題