Statistics
| Branch: | Revision:

root / trunk / Pithos.Interfaces / FileInfoExtensions.cs @ 540b8cf8

History | View | Annotate | Download (6.6 kB)

1 27361404 Panagiotis Kanavos
using System;
2 27361404 Panagiotis Kanavos
using System.Collections.Generic;
3 27361404 Panagiotis Kanavos
using System.Diagnostics.Contracts;
4 27361404 Panagiotis Kanavos
using System.Linq;
5 27361404 Panagiotis Kanavos
using System.Text;
6 27361404 Panagiotis Kanavos
using System.IO;
7 27361404 Panagiotis Kanavos
using System.Text.RegularExpressions;
8 27361404 Panagiotis Kanavos
using System.Threading.Tasks;
9 27361404 Panagiotis Kanavos
10 27361404 Panagiotis Kanavos
11 27361404 Panagiotis Kanavos
namespace Pithos.Interfaces
12 27361404 Panagiotis Kanavos
{
13 27361404 Panagiotis Kanavos
    public static class FileInfoExtensions
14 27361404 Panagiotis Kanavos
    {
15 4f6d51d4 Panagiotis Kanavos
        public static  string AsRelativeTo(this FileSystemInfo fileInfo,string path )
16 27361404 Panagiotis Kanavos
        {
17 27361404 Panagiotis Kanavos
            if (String.IsNullOrWhiteSpace(path))
18 27361404 Panagiotis Kanavos
                throw new ArgumentNullException("path");            
19 27361404 Panagiotis Kanavos
            Contract.EndContractBlock();
20 5e31048f Panagiotis Kanavos
            Contract.Assume(Enum.IsDefined(typeof(StringComparison),StringComparison.InvariantCultureIgnoreCase));
21 27361404 Panagiotis Kanavos
22 27361404 Panagiotis Kanavos
            if (!path.EndsWith("\\"))
23 27361404 Panagiotis Kanavos
                path=path.ToLower() + "\\";
24 27361404 Panagiotis Kanavos
            int pathLength = path.Length;            
25 27361404 Panagiotis Kanavos
            
26 f3d080df Panagiotis Kanavos
            var filePath = fileInfo.GetProperCapitalization();
27 5e31048f Panagiotis Kanavos
            
28 27361404 Panagiotis Kanavos
            if (!filePath.StartsWith(path,StringComparison.InvariantCultureIgnoreCase))
29 27361404 Panagiotis Kanavos
                throw new ArgumentException(String.Format("The path {0} doesn't contain the file {1}",path,filePath));
30 27361404 Panagiotis Kanavos
            
31 27361404 Panagiotis Kanavos
            var relativePath = filePath.Substring(pathLength, filePath.Length - pathLength);
32 27361404 Panagiotis Kanavos
33 27361404 Panagiotis Kanavos
            return relativePath;
34 27361404 Panagiotis Kanavos
        }
35 27361404 Panagiotis Kanavos
36 4f6d51d4 Panagiotis Kanavos
        public static string AsRelativeUrlTo(this FileSystemInfo fileInfo,string path )
37 27361404 Panagiotis Kanavos
        {
38 27361404 Panagiotis Kanavos
            if (String.IsNullOrWhiteSpace(path))
39 27361404 Panagiotis Kanavos
                throw new ArgumentNullException("path");
40 27361404 Panagiotis Kanavos
            Contract.EndContractBlock();
41 27361404 Panagiotis Kanavos
42 27361404 Panagiotis Kanavos
            var relativePath = fileInfo.AsRelativeTo(path);
43 27361404 Panagiotis Kanavos
            var replacedSlashes = relativePath.Replace("\\","/");
44 27361404 Panagiotis Kanavos
            var escaped = Uri.EscapeUriString(replacedSlashes);
45 27361404 Panagiotis Kanavos
            return escaped;
46 27361404 Panagiotis Kanavos
        }
47 27361404 Panagiotis Kanavos
48 27361404 Panagiotis Kanavos
        public static string RelativeUriToFilePath(this Uri uri)
49 27361404 Panagiotis Kanavos
        {
50 27361404 Panagiotis Kanavos
            var unescaped = Uri.UnescapeDataString(uri.ToString());
51 27361404 Panagiotis Kanavos
            var path = unescaped.Replace("/", "\\");
52 27361404 Panagiotis Kanavos
            return path;
53 27361404 Panagiotis Kanavos
        }
54 27361404 Panagiotis Kanavos
55 27361404 Panagiotis Kanavos
56 f3d080df Panagiotis Kanavos
        public static string GetProperDirectoryCapitalization(string fileName)
57 f3d080df Panagiotis Kanavos
        {
58 1b4a7550 Panagiotis Kanavos
            Contract.Ensures(!String.IsNullOrWhiteSpace(Contract.Result<string>()));
59 f3d080df Panagiotis Kanavos
            Contract.EndContractBlock();
60 1b4a7550 Panagiotis Kanavos
            
61 1b4a7550 Panagiotis Kanavos
            if (String.IsNullOrWhiteSpace(fileName))
62 1b4a7550 Panagiotis Kanavos
                return String.Empty;
63 f3d080df Panagiotis Kanavos
64 f3d080df Panagiotis Kanavos
            var dirInfo = new DirectoryInfo(fileName);
65 f3d080df Panagiotis Kanavos
            return dirInfo.GetProperCapitalization();
66 f3d080df Panagiotis Kanavos
        }
67 039a89e5 Panagiotis Kanavos
68 f3d080df Panagiotis Kanavos
69 f3d080df Panagiotis Kanavos
        public static string GetProperCapitalization(this DirectoryInfo dirInfo)
70 f3d080df Panagiotis Kanavos
        {
71 f3d080df Panagiotis Kanavos
            if (dirInfo == null)
72 f3d080df Panagiotis Kanavos
                throw new ArgumentNullException("dirInfo");
73 f3d080df Panagiotis Kanavos
            Contract.EndContractBlock();
74 1b4a7550 Panagiotis Kanavos
            Contract.Assume(!String.IsNullOrWhiteSpace(dirInfo.FullName));
75 f3d080df Panagiotis Kanavos
76 f3d080df Panagiotis Kanavos
            var parentDirInfo = dirInfo.Parent;
77 f3d080df Panagiotis Kanavos
            if (null == parentDirInfo)
78 f3d080df Panagiotis Kanavos
                return dirInfo.Name;
79 e81dd1f6 Panagiotis Kanavos
80 e81dd1f6 Panagiotis Kanavos
            try
81 e81dd1f6 Panagiotis Kanavos
            {
82 e81dd1f6 Panagiotis Kanavos
83 e81dd1f6 Panagiotis Kanavos
84 e81dd1f6 Panagiotis Kanavos
                if (dirInfo.Exists)
85 e81dd1f6 Panagiotis Kanavos
                    return Path.Combine(GetProperDirectoryCapitalization(parentDirInfo.FullName),
86 e81dd1f6 Panagiotis Kanavos
                                        parentDirInfo.GetDirectories(dirInfo.Name)[0].Name);
87 e81dd1f6 Panagiotis Kanavos
                else
88 e81dd1f6 Panagiotis Kanavos
                {
89 e81dd1f6 Panagiotis Kanavos
                    return dirInfo.FullName;
90 e81dd1f6 Panagiotis Kanavos
                }
91 e81dd1f6 Panagiotis Kanavos
            }
92 e81dd1f6 Panagiotis Kanavos
            catch (DirectoryNotFoundException)
93 e81dd1f6 Panagiotis Kanavos
            {
94 e81dd1f6 Panagiotis Kanavos
                //An exception can occur if a directory is deleted right after the Exists call
95 e81dd1f6 Panagiotis Kanavos
                return dirInfo.FullName;
96 e81dd1f6 Panagiotis Kanavos
            }
97 f3d080df Panagiotis Kanavos
        }
98 f3d080df Panagiotis Kanavos
99 f3d080df Panagiotis Kanavos
100 f3d080df Panagiotis Kanavos
        public static string GetProperFilePathCapitalization(string fileName)
101 f3d080df Panagiotis Kanavos
        {
102 1b4a7550 Panagiotis Kanavos
            Contract.Ensures(!String.IsNullOrWhiteSpace(Contract.Result<string>()));
103 f3d080df Panagiotis Kanavos
            Contract.EndContractBlock();
104 039a89e5 Panagiotis Kanavos
            if (String.IsNullOrWhiteSpace(fileName))
105 039a89e5 Panagiotis Kanavos
                return String.Empty;
106 f3d080df Panagiotis Kanavos
107 f3d080df Panagiotis Kanavos
108 f3d080df Panagiotis Kanavos
            var fileInfo = new FileInfo(fileName);
109 f3d080df Panagiotis Kanavos
            return fileInfo.GetProperCapitalization();
110 f3d080df Panagiotis Kanavos
        }
111 f3d080df Panagiotis Kanavos
112 f3d080df Panagiotis Kanavos
        public static string GetProperCapitalization(this FileInfo fileInfo)
113 f3d080df Panagiotis Kanavos
        {
114 f3d080df Panagiotis Kanavos
            if (fileInfo == null)
115 f3d080df Panagiotis Kanavos
                throw new ArgumentNullException("fileInfo");
116 f3d080df Panagiotis Kanavos
            Contract.EndContractBlock();
117 f3d080df Panagiotis Kanavos
118 f3d080df Panagiotis Kanavos
119 f3d080df Panagiotis Kanavos
            var dirInfo = fileInfo.Directory;
120 27361404 Panagiotis Kanavos
121 f3d080df Panagiotis Kanavos
            //Directory will not be null for an absolute path
122 f3d080df Panagiotis Kanavos
            Contract.Assume(dirInfo != null);
123 f3d080df Panagiotis Kanavos
124 e81dd1f6 Panagiotis Kanavos
            try
125 e81dd1f6 Panagiotis Kanavos
            {
126 e81dd1f6 Panagiotis Kanavos
127 e81dd1f6 Panagiotis Kanavos
                if (fileInfo.Exists)
128 e81dd1f6 Panagiotis Kanavos
                    return Path.Combine(GetProperDirectoryCapitalization(dirInfo.FullName),
129 e81dd1f6 Panagiotis Kanavos
                                        dirInfo.GetFiles(fileInfo.Name)[0].Name);
130 e81dd1f6 Panagiotis Kanavos
                else
131 e81dd1f6 Panagiotis Kanavos
                {
132 e81dd1f6 Panagiotis Kanavos
                    return fileInfo.FullName;
133 e81dd1f6 Panagiotis Kanavos
                }
134 e81dd1f6 Panagiotis Kanavos
            }
135 e81dd1f6 Panagiotis Kanavos
            catch (FileNotFoundException)
136 e81dd1f6 Panagiotis Kanavos
            {
137 e81dd1f6 Panagiotis Kanavos
                //An exception can occur if a file is deleted right after the Exists call
138 e81dd1f6 Panagiotis Kanavos
                return fileInfo.FullName;
139 e81dd1f6 Panagiotis Kanavos
140 e81dd1f6 Panagiotis Kanavos
            }
141 f3d080df Panagiotis Kanavos
        }
142 f3d080df Panagiotis Kanavos
143 f3d080df Panagiotis Kanavos
        public static string GetProperCapitalization(this FileSystemInfo info)
144 f3d080df Panagiotis Kanavos
        {
145 f3d080df Panagiotis Kanavos
            if (info is FileInfo)
146 f3d080df Panagiotis Kanavos
                return (info as FileInfo).GetProperCapitalization();
147 f3d080df Panagiotis Kanavos
            if (info is DirectoryInfo)
148 f3d080df Panagiotis Kanavos
                return (info as DirectoryInfo).GetProperCapitalization();
149 f3d080df Panagiotis Kanavos
            throw new NotSupportedException("Unexpected parameter type");
150 f3d080df Panagiotis Kanavos
        }
151 f3d080df Panagiotis Kanavos
152 f3d080df Panagiotis Kanavos
        public static DirectoryInfo WithProperCapitalization(this DirectoryInfo dirInfo)
153 f3d080df Panagiotis Kanavos
        {
154 f3d080df Panagiotis Kanavos
            if (dirInfo==null)
155 f3d080df Panagiotis Kanavos
                throw new ArgumentNullException("dirInfo");
156 f3d080df Panagiotis Kanavos
            Contract.EndContractBlock();
157 f3d080df Panagiotis Kanavos
158 f3d080df Panagiotis Kanavos
            var path = dirInfo.GetProperCapitalization();
159 f3d080df Panagiotis Kanavos
            return new DirectoryInfo(path);
160 f3d080df Panagiotis Kanavos
        }
161 f3d080df Panagiotis Kanavos
162 f3d080df Panagiotis Kanavos
        public static FileInfo WithProperCapitalization(this FileInfo fileInfo)
163 f3d080df Panagiotis Kanavos
        {
164 f3d080df Panagiotis Kanavos
            if (fileInfo==null)
165 f3d080df Panagiotis Kanavos
                throw new ArgumentNullException("fileInfo");
166 f3d080df Panagiotis Kanavos
            Contract.EndContractBlock();
167 f3d080df Panagiotis Kanavos
168 f3d080df Panagiotis Kanavos
            var path = fileInfo.GetProperCapitalization();
169 f3d080df Panagiotis Kanavos
            return new FileInfo(path);
170 f3d080df Panagiotis Kanavos
        }
171 f3d080df Panagiotis Kanavos
172 f3d080df Panagiotis Kanavos
        public static FileSystemInfo WithProperCapitalization(this FileSystemInfo info)
173 f3d080df Panagiotis Kanavos
        {
174 f3d080df Panagiotis Kanavos
            if (info==null)
175 f3d080df Panagiotis Kanavos
                throw new ArgumentNullException("info");
176 f3d080df Panagiotis Kanavos
            Contract.EndContractBlock();
177 f3d080df Panagiotis Kanavos
178 f3d080df Panagiotis Kanavos
            if (info is FileInfo)
179 f3d080df Panagiotis Kanavos
                return (info as FileInfo).WithProperCapitalization();
180 f3d080df Panagiotis Kanavos
            if (info is DirectoryInfo)
181 f3d080df Panagiotis Kanavos
                return (info as DirectoryInfo).WithProperCapitalization();
182 f3d080df Panagiotis Kanavos
183 f3d080df Panagiotis Kanavos
            throw new NotSupportedException("Unexpected parameter type");
184 f3d080df Panagiotis Kanavos
        }
185 540b8cf8 Panagiotis Kanavos
186 540b8cf8 Panagiotis Kanavos
        public static FileSystemInfo FromPath(string filePath)
187 540b8cf8 Panagiotis Kanavos
        {
188 540b8cf8 Panagiotis Kanavos
            if (String.IsNullOrWhiteSpace(filePath))
189 540b8cf8 Panagiotis Kanavos
                throw new ArgumentNullException("filePath");
190 540b8cf8 Panagiotis Kanavos
            Contract.EndContractBlock();
191 540b8cf8 Panagiotis Kanavos
192 540b8cf8 Panagiotis Kanavos
            return Directory.Exists(filePath) ? 
193 540b8cf8 Panagiotis Kanavos
                (FileSystemInfo) new DirectoryInfo(filePath) 
194 540b8cf8 Panagiotis Kanavos
                : new FileInfo(filePath);
195 540b8cf8 Panagiotis Kanavos
        }
196 27361404 Panagiotis Kanavos
    }
197 27361404 Panagiotis Kanavos
}