| File: PartitionedPathUtils.cs | Web Access |
| Project: src\src\Microsoft.ML.Parquet\Microsoft.ML.Parquet.csproj (Microsoft.ML.Parquet) |
// Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. // See the LICENSE file in the project root for more information. using System; using System.Collections.Generic; using System.IO; using Microsoft.ML.Runtime; namespace Microsoft.ML.Data.Utilities { internal static class PartitionedPathUtils { /// <summary> /// Make a full path realtive to a base path. /// </summary> /// <param name="basepath">The base path, assumed to be a directory.</param> /// <param name="path">The full path.</param> /// <returns>The relative path.</returns> /// <exception cref="InvalidOperationException">If the paths are not relative.</exception> internal static string MakePathRelative(string basepath, string path) { Contracts.AssertNonEmpty(basepath); Contracts.AssertNonEmpty(path); Uri baseUri = new Uri(basepath); Uri uri = new Uri(path); if (baseUri.Scheme != uri.Scheme) { throw Contracts.ExceptParam(nameof(basepath), "Paths cannot be made relative as they are of different schemes."); } string relativePath; try { if (!baseUri.AbsoluteUri.EndsWith("/")) { baseUri = new Uri(baseUri.AbsoluteUri + "/"); } relativePath = Uri.UnescapeDataString(baseUri.MakeRelativeUri(uri).ToString()); } catch (ArgumentNullException e) { throw Contracts.Except(e, "Paths could not be made relative."); } catch (InvalidOperationException e) { throw Contracts.Except(e, "Paths could not be made relative."); } if (uri.Scheme.Equals("file", StringComparison.OrdinalIgnoreCase)) { relativePath = relativePath.Replace(Path.AltDirectorySeparatorChar, Path.DirectorySeparatorChar); } return relativePath; } /// <summary> /// Split a path string into an enumerable list of the directories. /// </summary> /// <param name="path">The path string to split.</param> /// <returns>An enumerable list of all non-empty directories.</returns> internal static IEnumerable<string> SplitDirectories(string path) { char[] separators = { Path.DirectorySeparatorChar }; var cleanPath = path.Replace(Path.AltDirectorySeparatorChar, Path.DirectorySeparatorChar); return cleanPath.Split(separators, StringSplitOptions.RemoveEmptyEntries); } } }