Какой простой способ проверить, является ли каталог 1 подкаталогом каталога 2 и наоборот?
Я проверил вспомогательные классы Path и DirectoryInfo, но не нашел для этого функции, готовой к работе системы. Я думал, что это будет где-то там.
У вас, ребята, есть идея, где это найти?
Я сам пытался выписать чек, но это сложнее, чем я ожидал, когда начал.
Вы можете сравнить directory2 со свойством Parent directory1
при использовании DirectoryInfo в обоих случаях.
DirectoryInfo d1 = new DirectoryInfo(@"C:\Program Files\MyApp");
DirectoryInfo d2 = new DirectoryInfo(@"C:\Program Files\MyApp\Images");
if(d2.Parent.FullName == d1.FullName)
{
Console.WriteLine ("Sub directory");
}
Полное имя второго каталога (d2) будет содержать полное имя первого каталога (d1), если это подпапка d1.
Предполагается, что вы используете действительные каталоги.
if (d2.FullName.Contains(d1.FullName))
{
//dowork
}
Если вам нужно проверить подключенные диски, вы можете попробовать
static void Main(string[] args)
{
if (GetUNCPath(d2.FullName).ToLower().Contains(GetUNCPath(d1.FullName).ToLower()))
{
}
}
[DllImport("mpr.dll", CharSet = CharSet.Unicode, SetLastError = true)]
private static extern int WNetGetConnection(
[MarshalAs(UnmanagedType.LPTStr)] string localName,
[MarshalAs(UnmanagedType.LPTStr)] StringBuilder remoteName, ref int length);
private static string GetUNCPath(string originalPath)
{
StringBuilder sb = new StringBuilder(512);
int size = sb.Capacity;
// look for the {LETTER}: combination ...
if (originalPath.Length > 2 && originalPath[1] == ':')
{
// don't use char.IsLetter here - as that can be misleading
// the only valid drive letters are a-z && A-Z.
char c = originalPath[0];
if ((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z'))
{
int error = WNetGetConnection(originalPath.Substring(0, 2), sb, ref size);
if (error == 0)
{
DirectoryInfo dir = new DirectoryInfo(originalPath);
string path = Path.GetFullPath(originalPath).Substring(Path.GetPathRoot(originalPath).Length);
return Path.Combine(sb.ToString().TrimEnd(), path);
}
}
}
return originalPath;
}
Код для подключенного диска взят из http://social.msdn.microsoft.com/Forums / en / csharpgeneral / thread / 6f79f2b3-d092-431f-bc28-d15d93cf5d09
Если у вас есть два пути, посмотрите на это:
Нормализовать имена каталогов в C #
http://filedirectorypath.codeplex.com/ (я не знаю его качества)
И используйте это:
var ancestor = new DirectoryPathAbsolute(ancestorPath);
var child = new DirectoryPathAbsolute(childPath);
var res = child.IsChildDirectoryOf(ancestor); //I don't think it actually checks for case-sensitive filesystems
В противном случае, если вы хотите узнать, существует ли каталог как подкаталог в пути, посмотрите:
Directory.EnumerateDirectories
Пришел в .Net 4.0
. Пример:
Содержит ли путь
каталог, начинающийся с Консоль
:
//* is a wildcard. If you remove it, it search for directories called "Console"
var res = Directory.EnumerateDirectories(@path, "Console*", SearchOption.AllDirectories).Any();
Вы можете использовать Path.GetDirectoryName Method , чтобы получить родительский каталог. Это работает и для каталогов.
DirectoryInfo имеет свойство Parent, которое также является типом DirectoryInfo. Вы можете использовать это, чтобы определить, является ли ваш каталог подкаталогом родительского каталога.