public static async Task <IStorageFolder> CreateFolderAsync(
            this IStorageProvider storageProvider,
            IStoragePath path,
            bool recursive     = false,
            IProgress progress = null,
            CancellationToken cancellationToken = default(CancellationToken))
        {
            if (storageProvider == null)
            {
                throw new ArgumentNullException(nameof(storageProvider));
            }
            if (path == null)
            {
                throw new ArgumentNullException(nameof(path));
            }
            if (storageProvider.Features.TryGetFeature(out ICreateByPathFeature implmentation))
            {
                return(await implmentation.CreateFolderAsync(storageProvider, path, recursive, progress, cancellationToken));
            }
            // Default implementation.
            var p = await path.GetParentAsync(cancellationToken);

            switch (p)
            {
            case null:
                throw new InvalidOperationException($"Unable to resolve parent of {path.Uri}.");

            case IStorageFolder folder:
                return(await folder.CreateFolderAsync(path.Name, progress, cancellationToken));

            case IStorageRecord _:
                throw new InvalidOperationException($"Parent of {path.Uri} is a storage record.");

            case IStoragePath parentPath:
                if (recursive)
                {
                    var folder = await storageProvider.CreateFolderAsync(parentPath, true, progress, cancellationToken);

                    return(await folder.CreateFolderAsync(path.Name, progress, cancellationToken));
                }
                throw new InvalidOperationException($"Parent of {path.Uri} does not exist.");

            default:
                throw new NotImplementedException($"No implementation provided that handles {p.GetType()}");
            }
        }
 public static IStoragePath GetParent(this IStoragePath path)
 {
     return(path.GetParentAsync().GetAwaiter().GetResult());
 }