Exemple #1
0
        public static IFileSystemInfo FileSystemInfoFromPath(string path)
        {
            path = FileTools.RootPath(path);

            if (File.Exists(path))
            {
                return(FileTools.IsZip(path) ? (IFileSystemInfo) new ZipFolder(path) : new FileSystemFile(path));
            }

            if (Directory.Exists(path))
            {
                return(new FileSystemFolder(path));
            }

            IFolder entryPoint = null;
            var     items      = new List <string>();

            while (!string.IsNullOrEmpty(path))
            {
                entryPoint = TryToResolveEntryPoint(path);
                if (entryPoint != null)
                {
                    break;
                }

                items.Insert(0, Path.GetFileName(path));
                path = Path.GetDirectoryName(path);
            }

            if (entryPoint == null)
            {
                throw new IOException("Directory {0} not found.".FormatWith(path));
            }

            for (var i = 0; i < items.Count - 1; i++)
            {
                var name = items[i];
                path = Path.Combine(path, name);

                entryPoint = entryPoint.GetFolders().FirstOrDefault(f => name.Equals(f.Name, StringComparison.OrdinalIgnoreCase));
                if (entryPoint == null)
                {
                    throw new IOException("Directory {0} not found.".FormatWith(path));
                }
            }

            var resultName = items.Last();

            path = Path.Combine(path, resultName);

            var file = entryPoint.GetFiles().FirstOrDefault(f => resultName.Equals(f.Name, StringComparison.OrdinalIgnoreCase));

            if (file != null)
            {
                return(file);
            }

            var folder = entryPoint.GetFolders().FirstOrDefault(f => resultName.Equals(f.Name, StringComparison.OrdinalIgnoreCase));

            if (folder == null)
            {
                throw new IOException("File or folder {0} not found.".FormatWith(path));
            }

            return(folder);
        }