/// <summary> /// Returns all files in the given directory. /// </summary> /// <remarks> /// This method simply returns the files files of the given <paramref name="directoryAccessor"/>, filtered /// if <paramref name="showSystemResources"/> is set to <c>true</c>. /// </remarks> /// <param name="directoryAccessor">Directory resource accessor to get all files for.</param> /// <param name="showSystemResources">If set to <c>true</c>, system resources like the virtual drives and directories of the /// <see cref="IResourceMountingService"/> will also be returned, else removed from the result value.</param> /// <returns>Collection of accessors for all files or <c>null</c>, /// if the given <paramref name="directoryAccessor"/> is not a <see cref="IFileSystemResourceAccessor"/>.</returns> public static ICollection <IFileSystemResourceAccessor> GetFiles(IFileSystemResourceAccessor directoryAccessor, bool showSystemResources, bool showChainedDirectories = true) { IResourceMountingService resourceMountingService = ServiceRegistration.Get <IResourceMountingService>(); IFileSystemResourceAccessor chainedResourceAccesor; // Needed in multiple source locations, that's why we declare it here ICollection <IFileSystemResourceAccessor> result = new List <IFileSystemResourceAccessor>(); foreach (IFileSystemResourceAccessor fileAccessor in directoryAccessor.GetFiles()) { if (!showSystemResources && resourceMountingService.IsVirtualResource(fileAccessor.CanonicalLocalResourcePath)) { fileAccessor.Dispose(); continue; } // We try to chain up chained resource providers if (!showChainedDirectories && TryUnfold(fileAccessor, out chainedResourceAccesor)) { if (chainedResourceAccesor.IsFile) { result.Add(chainedResourceAccesor); } else { chainedResourceAccesor.Dispose(); } fileAccessor.Dispose(); } else { result.Add(fileAccessor); } } return(result); }
protected bool MountResource() { IResourceMountingService resourceMountingService = ServiceRegistration.Get <IResourceMountingService>(); _rootDirectoryName = Guid.NewGuid().ToString(); _mountPath = resourceMountingService.CreateRootDirectory(_rootDirectoryName) == null ? null : resourceMountingService.AddResource(_rootDirectoryName, _baseAccessor); return(_mountPath != null); }
protected bool UnmountResource() { IResourceMountingService resourceMountingService = ServiceRegistration.Get <IResourceMountingService>(); if (_mountPath == null) { return(false); } resourceMountingService.RemoveResource(_rootDirectoryName, _baseAccessor); resourceMountingService.DisposeRootDirectory(_rootDirectoryName); return(true); }
/// <summary> /// Returns all files in the given directory. /// </summary> /// <remarks> /// This method simply returns the files files of the given <paramref name="directoryAccessor"/>, filtered /// if <paramref name="showSystemResources"/> is set to <c>true</c>. /// </remarks> /// <param name="directoryAccessor">Directory resource accessor to get all files for.</param> /// <param name="showSystemResources">If set to <c>true</c>, system resources like the virtual drives and directories of the /// <see cref="IResourceMountingService"/> will also be returned, else removed from the result value.</param> /// <returns>Collection of accessors for all files or <c>null</c>, /// if the given <paramref name="directoryAccessor"/> is not a <see cref="IFileSystemResourceAccessor"/>.</returns> public static ICollection <IFileSystemResourceAccessor> GetFiles(IFileSystemResourceAccessor directoryAccessor, bool showSystemResources) { IResourceMountingService resourceMountingService = ServiceRegistration.Get <IResourceMountingService>(); ICollection <IFileSystemResourceAccessor> result = new List <IFileSystemResourceAccessor>(); foreach (IFileSystemResourceAccessor fileAccessor in directoryAccessor.GetFiles()) { if (!showSystemResources && resourceMountingService.IsVirtualResource(fileAccessor.CanonicalLocalResourcePath)) { fileAccessor.Dispose(); continue; } result.Add(fileAccessor); } return(result); }
/// <summary> /// Returns all child directories of the given directory. /// </summary> /// <remarks> /// This will return all native child directories of the given directory together with all virtual child /// directories. The native child directories are taken directly from the given <paramref name="directoryAccessor"/>, /// the virtual child directories are obtained by taking the root directories of each chained resource provider applied /// to the child files of the given directory. /// If, for example, the given <paramref name="directoryAccessor"/> contains a child directory "A" and a child /// archive file "B" which can work as input for an installed archive provider, providing the root directory "C" /// of that archive, this method will return the resource accessors for directories "A" and "C". /// </remarks> /// <param name="directoryAccessor">Directory resource accessor to get all child directories for.</param> /// <param name="showSystemResources">If set to <c>true</c>, system resources like the virtual drives and directories of the /// <see cref="IResourceMountingService"/> will also be returned, else removed from the result value.</param> /// <returns>Collection of directory accessors for all native and virtual child directories or <c>null</c>, /// if the given <paramref name="directoryAccessor"/> is not a <see cref="IFileSystemResourceAccessor"/> and /// if there is no chained resource provider to unfold the given directory.</returns> public static ICollection <IFileSystemResourceAccessor> GetChildDirectories(IFileSystemResourceAccessor directoryAccessor, bool showSystemResources) { IResourceMountingService resourceMountingService = ServiceRegistration.Get <IResourceMountingService>(); IFileSystemResourceAccessor chainedResourceAccesor; // Needed in multiple source locations, that's why we declare it here ICollection <IFileSystemResourceAccessor> childDirectories = directoryAccessor.GetChildDirectories(); ICollection <IFileSystemResourceAccessor> result = new List <IFileSystemResourceAccessor>(); if (childDirectories != null) { // Directories are maybe filtered and then just added foreach (IFileSystemResourceAccessor childDirectoryAccessor in childDirectories) { if (!showSystemResources && resourceMountingService.IsVirtualResource(childDirectoryAccessor.CanonicalLocalResourcePath)) { childDirectoryAccessor.Dispose(); continue; } result.Add(childDirectoryAccessor); } } ICollection <IFileSystemResourceAccessor> files = directoryAccessor.GetFiles(); if (files != null) { // For files, we try to chain up chained resource providers foreach (IFileSystemResourceAccessor fileAccessor in files) { using (fileAccessor) { if (!showSystemResources && resourceMountingService.IsVirtualResource(fileAccessor.CanonicalLocalResourcePath)) { continue; } if (TryUnfold(fileAccessor, out chainedResourceAccesor)) { if (!chainedResourceAccesor.IsFile) { result.Add(chainedResourceAccesor); } else { chainedResourceAccesor.Dispose(); } } // Simply ignore files because we only want to return directories } } } if (result.Count > 0) { return(result); } // Try to unfold simple resource if (TryUnfold(directoryAccessor, out chainedResourceAccesor)) { if (!chainedResourceAccesor.IsFile) { return(new List <IFileSystemResourceAccessor>(new IFileSystemResourceAccessor[] { chainedResourceAccesor })); } chainedResourceAccesor.Dispose(); } return(null); }
/// <summary> /// Returns all child directories of the given directory. /// </summary> /// <remarks> /// This will return all native child directories of the given directory together with all virtual child /// directories. The native child directories are taken directly from the given <paramref name="directoryAccessor"/>, /// the virtual child directories are obtained by taking the root directories of each chained resource provider applied /// to the child files of the given directory. /// If, for example, the given <paramref name="directoryAccessor"/> contains a child directory "A" and a child /// archive file "B" which can work as input for an installed archive provider, providing the root directory "C" /// of that archive, this method will return the resource accessors for directories "A" and "C". /// </remarks> /// <param name="directoryAccessor">Directory resource accessor to get all child directories for.</param> /// <param name="showSystemResources">If set to <c>true</c>, system resources like the virtual drives and directories of the /// <see cref="IResourceMountingService"/> will also be returned, else removed from the result value.</param> /// <returns>Collection of directory accessors for all native and virtual child directories or <c>null</c>, /// if the given <paramref name="directoryAccessor"/> is not a <see cref="IFileSystemResourceAccessor"/> and /// if there is no chained resource provider to unfold the given directory.</returns> public static ICollection <IFileSystemResourceAccessor> GetChildDirectories(IResourceAccessor directoryAccessor, bool showSystemResources) { IResourceMountingService resourceMountingService = ServiceRegistration.Get <IResourceMountingService>(); IResourceAccessor chainedResourceAccesor; // Needed in multiple source locations, that's why we declare it here if (directoryAccessor is IFileSystemResourceAccessor) { IFileSystemResourceAccessor dirFsra = (IFileSystemResourceAccessor)directoryAccessor; ICollection <IFileSystemResourceAccessor> childDirectories = dirFsra.GetChildDirectories(); ICollection <IFileSystemResourceAccessor> result = new List <IFileSystemResourceAccessor>(); if (childDirectories != null) { // Directories are maybe filtered and then just added foreach (IFileSystemResourceAccessor childDirectoryAccessor in childDirectories) { if (!showSystemResources && resourceMountingService.IsVirtualResource(childDirectoryAccessor.CanonicalLocalResourcePath)) { childDirectoryAccessor.Dispose(); continue; } result.Add(childDirectoryAccessor); } } ICollection <IFileSystemResourceAccessor> files = dirFsra.GetFiles(); if (files != null) { // For files, we try to chain up chained resource providers foreach (IFileSystemResourceAccessor fileAccessor in files) { if (!showSystemResources && resourceMountingService.IsVirtualResource(fileAccessor.CanonicalLocalResourcePath)) { fileAccessor.Dispose(); continue; } if (TryUnfold(fileAccessor, out chainedResourceAccesor)) { IFileSystemResourceAccessor chainedFsra = chainedResourceAccesor as IFileSystemResourceAccessor; if (chainedFsra != null) { result.Add(chainedFsra); } else { chainedResourceAccesor.Dispose(); } } else { fileAccessor.Dispose(); } } } return(result); } // Try to unfold simple resource IResourceAccessor dra = directoryAccessor.Clone(); try { if (TryUnfold(dra, out chainedResourceAccesor)) { IFileSystemResourceAccessor chainedFsra = chainedResourceAccesor as IFileSystemResourceAccessor; if (chainedFsra != null) { return(new List <IFileSystemResourceAccessor>(new IFileSystemResourceAccessor[] { chainedFsra })); } chainedResourceAccesor.Dispose(); } else { dra.Dispose(); } } catch { dra.Dispose(); throw; } return(null); }