| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788 |
- //
- // System.Web.Util.PathUtil
- //
- // Authors:
- // Gonzalo Paniagua Javier ([email protected])
- //
- // (C) 2002 Ximian, Inc (http://www.ximian.com)
- //
- using System;
- using System.Collections;
- using System.IO;
- using System.Reflection;
- namespace System.Web.Util
- {
- internal class PathUtil
- {
- static string appbase;
- static char [] separators;
- static PathUtil ()
- {
- // This hack is a workaround until AppDomainVirtualPath works... Gotta investigate it.
- Assembly entry = Assembly.GetEntryAssembly ();
- appbase = Path.GetDirectoryName (entry.Location);
- //
- if (Path.DirectorySeparatorChar != Path.AltDirectorySeparatorChar)
- separators = new char [] {Path.DirectorySeparatorChar, Path.AltDirectorySeparatorChar};
- else
- separators = new char [] {Path.DirectorySeparatorChar};
- }
-
- static string MakeAbsolute (string abspath)
- {
- string [] parts = abspath.Split (separators);
- ArrayList valid = new ArrayList ();
- int len = parts.Length;
- bool hasDots = false;
- for (int i = 0; i < len; i++) {
- if (parts [i] == ".") {
- hasDots = true;
- continue;
- }
- if (parts [i] == "..") {
- hasDots = true;
- if (valid.Count > 0)
- valid.RemoveAt (valid.Count - 1);
- continue;
- }
- valid.Add (parts [i]);
- }
- if (!hasDots)
- return abspath;
- parts = (String []) valid.ToArray (typeof (string));
- string result = String.Join (new String (Path.DirectorySeparatorChar, 1), parts);
- if (!Path.IsPathRooted (result))
- return Path.DirectorySeparatorChar + result;
- return result;
- }
- static public string Combine (string basepath, string relative)
- {
- if (relative == null || relative.Length == 0)
- throw new ArgumentException ("empty or null", "relative");
- char first = relative [0];
- if (first == '/' || first == '\\' || Path.IsPathRooted (relative))
- throw new ArgumentException ("'relative' is rooted", "relative");
- if (first == '~' && relative.Length > 1 && Array.IndexOf (separators, relative [1]) != -1)
- return Path.Combine (appbase, relative.Substring (2));
- if (basepath == null)
- basepath = appbase;
- return MakeAbsolute (Path.Combine (basepath, relative));
- }
- }
- }
|