Selective Sync now shows both server AND local folders
[pithos-ms-client] / trunk / Pithos.Interfaces / FileInfoExtensions.cs
index 65f5703..e22da1e 100644 (file)
@@ -1,4 +1,45 @@
-using System;
+#region
+/* -----------------------------------------------------------------------
+ * <copyright file="FileInfoExtensions.cs" company="GRNet">
+ * 
+ * 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.
+ * </copyright>
+ * -----------------------------------------------------------------------
+ */
+#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<string>()));
             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<string>()));
             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);
+        }
     }
 }