2014-09-29 166 views
1

當我得到類似c:\ folder1 \ a12 \ somefile.txt的路徑時,我想檢查文件名是否包含目錄c:\ folder1 \ a1。c#檢查文件路徑是否包含特定目錄

上面的文件名應該返回false。

該代碼無權訪問相關文件系統。它不需要檢查文件或文件夾的存在。只需要遵循文件和目錄名稱約定。

如果代碼可以處理備用路徑分隔符/ UNIX路徑,那就太好了。

+3

還有,你試過這麼遠嗎? – EricLaw 2014-09-29 14:56:47

+0

我的代碼是在.NET 1.1中寫入的,並且條件太多。我正在尋找.NET 4+中的新功能,但找不到任何快速解決方案。至少在Windows路徑中,我希望有人已經解決了這個問題。 – James 2014-09-29 15:10:00

+0

你可以使用'string.Contains'或'string.StartsWith'嗎? – 2014-09-29 15:21:00

回答

3

您可以簡單地檢查您的文件路徑是否以目錄路徑開頭。不要忘記用分隔符後綴目錄路徑,以避免誤報

public static bool IsFileBelowDirectory(string fileInfo, string directoryInfo, string separator) 
{ 
    var directoryPath = string.Format("{0}{1}" 
    , directoryInfo 
    , directoryInfo.EndsWith(separator) ? "": separator); 

    return fileInfo.StartsWith(directoryPath, StringComparison.OrdinalIgnoreCase); 
} 
+3

不要忘記正常化雙方的分隔符。 – 2014-09-29 14:58:31

+0

@AlexeiLevenkov是正確的,更重要的是,您可能需要仔細研究OrdinalIgnoreCase參數,因爲Unix路徑通常區分大小寫。您的電話要麼參數化該值,要麼將其包裝在將根據您的環境構建的類中 – samy 2014-09-29 21:18:12

2

這會適合您嗎?

public bool isSubDir(string parentPath, string childPath) 
{ 
    var parentUri = new Uri(parentPath); 
    var childUri = new DirectoryInfo(childPath).Parent; 
    while(childUri != null) 
    { 
     if(new Uri(childUri.FullName) == parentUri) 
     { 
      return true ; 
     } 
     childUri = childUri.Parent; 
    } 
    return false; 
} 
1

我認爲最好的辦法是使用string.Contains(),以檢查是否完整路徑包含要

public static bool IsUnderDirectory(string fullpath, string directoryName) 
{ 
    return fullpath.Contains(string.Format(@"{0}\",directoryName)); 
} 

我希望這會幫助你

+1

這適用於Windows文件夾。只需要確保沒有尾隨分隔符。 – James 2014-09-29 15:57:28

1

喜歡的東西的文件夾這應該適用於我認爲的unix風格路徑,並且不依賴於實際存在的文件/目錄。

string someFile = @"/var/folder1/a12/somefile.txt"; 
// true 
Console.WriteLine("Contains?: {0}", someFile.ContainsSubPath(@"/var/folder1/a12/")); 
// false 
Console.WriteLine("Contains?: {0}", someFile.ContainsSubPath(@"/var/folder1/a1/")); 

// windows style 
someFile = @"c:\folder1\a12\somefile.txt"; 
// true 
Console.WriteLine("Contains?: {0}", someFile.ContainsSubPath(@"c:\folder1\a12\")); 
// false 
Console.WriteLine("Contains?: {0}", someFile.ContainsSubPath(@"c:\folder1\a1\")); 

下面是擴展方法的代碼..

public static bool ContainsSubPath(this string pathToFile, string subPath) 
{ 
    pathToFile = Path.GetDirectoryName(pathToFile) + "\\"; 
    string searchPath = Path.GetDirectoryName(subPath) + "\\"; 

    bool containsIt = pathToFile.IndexOf(searchPath, StringComparison.OrdinalIgnoreCase) > -1; 

    return containsIt; 
} 
相關問題