61 lines
2.2 KiB
C#
61 lines
2.2 KiB
C#
|
|
using System;
|
||
|
|
using System.Collections.Generic;
|
||
|
|
using System.IO;
|
||
|
|
|
||
|
|
namespace DCIT.Core.Utilities
|
||
|
|
{
|
||
|
|
public static class PathUtility
|
||
|
|
{
|
||
|
|
public static string NormalizeDirectory(string path)
|
||
|
|
{
|
||
|
|
if (string.IsNullOrWhiteSpace(path))
|
||
|
|
{
|
||
|
|
return string.Empty;
|
||
|
|
}
|
||
|
|
|
||
|
|
var fullPath = Path.GetFullPath(path.Trim());
|
||
|
|
if (!fullPath.EndsWith(Path.DirectorySeparatorChar.ToString(), StringComparison.Ordinal))
|
||
|
|
{
|
||
|
|
fullPath += Path.DirectorySeparatorChar;
|
||
|
|
}
|
||
|
|
|
||
|
|
return fullPath;
|
||
|
|
}
|
||
|
|
|
||
|
|
public static bool AreSameOrNestedDirectories(string left, string right)
|
||
|
|
{
|
||
|
|
var normalizedLeft = NormalizeDirectory(left);
|
||
|
|
var normalizedRight = NormalizeDirectory(right);
|
||
|
|
if (string.IsNullOrEmpty(normalizedLeft) || string.IsNullOrEmpty(normalizedRight))
|
||
|
|
{
|
||
|
|
return false;
|
||
|
|
}
|
||
|
|
|
||
|
|
return normalizedLeft.Equals(normalizedRight, StringComparison.OrdinalIgnoreCase)
|
||
|
|
|| normalizedLeft.StartsWith(normalizedRight, StringComparison.OrdinalIgnoreCase)
|
||
|
|
|| normalizedRight.StartsWith(normalizedLeft, StringComparison.OrdinalIgnoreCase);
|
||
|
|
}
|
||
|
|
|
||
|
|
public static string GetRelativePath(string relativeTo, string path)
|
||
|
|
{
|
||
|
|
var root = new Uri(NormalizeDirectory(relativeTo), UriKind.Absolute);
|
||
|
|
var target = new Uri(Path.GetFullPath(path), UriKind.Absolute);
|
||
|
|
var relative = root.MakeRelativeUri(target).ToString().Replace('/', Path.DirectorySeparatorChar);
|
||
|
|
return Uri.UnescapeDataString(relative);
|
||
|
|
}
|
||
|
|
|
||
|
|
public static IEnumerable<string> ValidateDirectoryPair(string firstLabel, string firstPath, string secondLabel, string secondPath)
|
||
|
|
{
|
||
|
|
if (string.IsNullOrWhiteSpace(firstPath) || string.IsNullOrWhiteSpace(secondPath))
|
||
|
|
{
|
||
|
|
yield break;
|
||
|
|
}
|
||
|
|
|
||
|
|
if (AreSameOrNestedDirectories(firstPath, secondPath))
|
||
|
|
{
|
||
|
|
yield return string.Format("{0} 与 {1} 不能相同,也不能互为父子目录。", firstLabel, secondLabel);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|