X-Git-Url: https://code.grnet.gr/git/pithos-ms-client/blobdiff_plain/f3d080df476f28bb731d09efce2e1538b1fbb420..bbc59cd1c45cc06b1957365f1d3034e0eec15ebe:/trunk/Pithos.Interfaces/FileInfoExtensions.cs diff --git a/trunk/Pithos.Interfaces/FileInfoExtensions.cs b/trunk/Pithos.Interfaces/FileInfoExtensions.cs index 65f5703..e22da1e 100644 --- a/trunk/Pithos.Interfaces/FileInfoExtensions.cs +++ b/trunk/Pithos.Interfaces/FileInfoExtensions.cs @@ -1,4 +1,45 @@ -using System; +#region +/* ----------------------------------------------------------------------- + * + * + * Copyright 2011-2012 GRNET S.A. All rights reserved. + * + * Redistribution and use in source and binary forms, with or + * without modification, are permitted provided that the following + * conditions are met: + * + * 1. Redistributions of source code must retain the above + * copyright notice, this list of conditions and the following + * disclaimer. + * + * 2. Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following + * disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * + * THIS SOFTWARE IS PROVIDED BY GRNET S.A. ``AS IS'' AND ANY EXPRESS + * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GRNET S.A OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and + * documentation are those of the authors and should not be + * interpreted as representing official policies, either expressed + * or implied, of GRNET S.A. + * + * ----------------------------------------------------------------------- + */ +#endregion +using System; using System.Collections.Generic; using System.Diagnostics.Contracts; using System.Linq; @@ -55,37 +96,54 @@ namespace Pithos.Interfaces public static string GetProperDirectoryCapitalization(string fileName) { - if (String.IsNullOrWhiteSpace(fileName)) - throw new ArgumentNullException("fileName"); - if (!Path.IsPathRooted(fileName)) - throw new ArgumentException("fileName must be an absolute path", "fileName"); + Contract.Ensures(!String.IsNullOrWhiteSpace(Contract.Result())); Contract.EndContractBlock(); + + if (String.IsNullOrWhiteSpace(fileName)) + return String.Empty; var dirInfo = new DirectoryInfo(fileName); return dirInfo.GetProperCapitalization(); } + public static string GetProperCapitalization(this DirectoryInfo dirInfo) { if (dirInfo == null) throw new ArgumentNullException("dirInfo"); Contract.EndContractBlock(); + Contract.Assume(!String.IsNullOrWhiteSpace(dirInfo.FullName)); var parentDirInfo = dirInfo.Parent; if (null == parentDirInfo) return dirInfo.Name; - return Path.Combine(GetProperDirectoryCapitalization(parentDirInfo.FullName), - parentDirInfo.GetDirectories(dirInfo.Name)[0].Name); + + try + { + + + if (dirInfo.Exists) + return Path.Combine(GetProperDirectoryCapitalization(parentDirInfo.FullName), + parentDirInfo.GetDirectories(dirInfo.Name)[0].Name); + else + { + return dirInfo.FullName; + } + } + catch (DirectoryNotFoundException) + { + //An exception can occur if a directory is deleted right after the Exists call + return dirInfo.FullName; + } } public static string GetProperFilePathCapitalization(string fileName) { - if (String.IsNullOrWhiteSpace(fileName)) - throw new ArgumentNullException("fileName"); - if (!Path.IsPathRooted(fileName)) - throw new ArgumentException("fileName must be an absolute path", "fileName"); + Contract.Ensures(!String.IsNullOrWhiteSpace(Contract.Result())); Contract.EndContractBlock(); + if (String.IsNullOrWhiteSpace(fileName)) + return String.Empty; var fileInfo = new FileInfo(fileName); @@ -104,8 +162,25 @@ namespace Pithos.Interfaces //Directory will not be null for an absolute path Contract.Assume(dirInfo != null); - return Path.Combine(GetProperDirectoryCapitalization(dirInfo.FullName), - dirInfo.GetFiles(fileInfo.Name)[0].Name); + try + { + //Exists returns a cached value that can be true even if a file was deleted since the + //FileInfo object was created. + fileInfo.Refresh(); + if (fileInfo.Exists) + return Path.Combine(GetProperDirectoryCapitalization(dirInfo.FullName), + dirInfo.GetFiles(fileInfo.Name)[0].Name); + else + { + return fileInfo.FullName; + } + } + catch (FileNotFoundException) + { + //An exception can occur if a file is deleted right after the Exists call + return fileInfo.FullName; + + } } public static string GetProperCapitalization(this FileSystemInfo info) @@ -150,5 +225,16 @@ namespace Pithos.Interfaces throw new NotSupportedException("Unexpected parameter type"); } + + public static FileSystemInfo FromPath(string filePath) + { + if (String.IsNullOrWhiteSpace(filePath)) + throw new ArgumentNullException("filePath"); + Contract.EndContractBlock(); + + return Directory.Exists(filePath) ? + (FileSystemInfo) new DirectoryInfo(filePath) + : new FileInfo(filePath); + } } }