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 | } |