PathHelper
using System;
using System.IO;
namespace Relativity.Transfer
{
public static class PathHelper
{
public const int MaxSupportedPathLength = 248;
public const int MaxDisplayedPathLength = 200;
public static readonly string UncSignature = string.Empty.PadLeft(2, Path.DirectorySeparatorChar);
public static readonly string UnixSignature = '/'.ToString();
private const int WindowsAppendFileNameLength = 12;
private const int WindowsMaxPathLength = 260;
private const char WindowsPathSeparator = '\\';
private const char UnixPathSeparator = '/';
public static string CombineUnc(string path1, string path2)
{
if (string.IsNullOrEmpty(path1))
throw new ArgumentNullException("path1");
if (string.IsNullOrEmpty(path2))
throw new ArgumentNullException("path2");
NormalizePath(ref path1);
NormalizePath(ref path2);
path1 = TrimTrailingSlash(path1);
path2 = TrimLeadingSlash(path2);
return Path.Combine(path1, path2);
}
public static string CombineUnix(string path, string item)
{
if (string.IsNullOrEmpty(path))
throw new ArgumentNullException("path");
return NormalizeUnixPath(path) + "/" + item;
}
public static bool IsUncPath(string path)
{
if (!string.IsNullOrEmpty(path)) {
NormalizePath(ref path);
return !string.IsNullOrEmpty(path) && path.StartsWith(UncSignature, StringComparison.OrdinalIgnoreCase);
}
return false;
}
public static bool IsUnixPath(string path)
{
if (!string.IsNullOrEmpty(path))
return !string.IsNullOrEmpty(path) && path.StartsWith(UnixSignature, StringComparison.OrdinalIgnoreCase);
return false;
}
public static void NormalizePath(ref string path)
{
if (!string.IsNullOrEmpty(path) && path.StartsWith("file://", StringComparison.OrdinalIgnoreCase))
try {
Uri uri = new Uri(path, UriKind.RelativeOrAbsolute);
path = uri.LocalPath;
} catch (ArgumentException) {
} catch (UriFormatException) {
}
}
public static string GetTargetFilePath(string sourcePath, string targetPath, string targetFileName)
{
string text = (!string.IsNullOrEmpty(targetFileName)) ? targetFileName : Path.GetFileName(sourcePath);
return IsUnixPath(targetPath) ? CombineUnix(targetPath, text) : Path.Combine(targetPath, text);
}
public static string ToUnixPath(string path)
{
if (string.IsNullOrEmpty(path))
throw new ArgumentNullException("path");
return path.Replace('\\', '/');
}
public static string ToWindowsPath(string path)
{
if (string.IsNullOrEmpty(path))
throw new ArgumentNullException("path");
return path.Replace('/', '\\');
}
public static string TrimLeadingSlash(string path)
{
return string.IsNullOrEmpty(path) ? string.Empty : path.TrimStart(Path.DirectorySeparatorChar, Path.AltDirectorySeparatorChar);
}
public static string TrimTrailingSlash(string path)
{
return string.IsNullOrEmpty(path) ? string.Empty : path.TrimEnd(Path.DirectorySeparatorChar, Path.AltDirectorySeparatorChar);
}
public static string GetRelativePathDirectory(string file)
{
char c;
if (!string.IsNullOrEmpty(file)) {
int num = file.Length;
while (num > 0 && file[--num] != '/') {
}
if (num >= 1)
return file.Substring(0, num);
c = '/';
return c.ToString();
}
c = '/';
return c.ToString();
}
public static string NormalizeUnixPath(string path)
{
if (!string.IsNullOrEmpty(path)) {
path = ToUnixPath(path);
path = path.TrimStart(new char[1] {
'/'
});
path = path.TrimEnd(new char[1] {
'/'
});
}
path = "/" + path;
return path;
}
internal static string CheckAddLongPathPrefix(string path)
{
if (!string.IsNullOrEmpty(path) && !path.StartsWith("\\\\?\\", StringComparison.OrdinalIgnoreCase))
return (path.Length > 248) ? ForceAddLongPathPrefix(path) : path;
return path;
}
internal static string ForceAddLongPathPrefix(string path)
{
if (!string.IsNullOrEmpty(path) && !path.StartsWith("\\\\?\\", StringComparison.OrdinalIgnoreCase)) {
if (!path.StartsWith("\\\\", StringComparison.OrdinalIgnoreCase))
return "\\\\?\\" + path;
return "\\\\?\\UNC\\" + path.Substring(2);
}
return path;
}
internal static string ForceRemoveLongPathPrefix(string path)
{
if (!string.IsNullOrEmpty(path) && path.StartsWith("\\\\?\\", StringComparison.OrdinalIgnoreCase)) {
if (!path.StartsWith("\\\\?\\UNC\\", StringComparison.OrdinalIgnoreCase))
return path.Substring("\\\\?\\".Length);
return "\\\\" + path.Substring("\\\\?\\UNC\\".Length);
}
return path;
}
}
}