C# file absolute path and relative path conversion

 class Program
    {
        const string CONFIG_PATH = @"C:\SoftWare\Config.xml";
        const string IMAGE_PATH = @"C:\SoftWare\Resource\Img1.png";
        const string DATA_DIR = @"C:\SoftWare\Data";

        /// <summary>
        /// Creates a relative path from one file
        /// or folder to another.
        /// </summary>
        /// <param name="fromDirectory">
        /// Contains the directory that defines the
        /// start of the relative path.
        /// </param>
        /// <param name="toPath">
        /// Contains the path that defines the
        /// endpoint of the relative path.
        /// </param>
        /// <returns>
        /// The relative path from the start
        /// directory to the end path.
        /// </returns>
        /// <exception cref="ArgumentNullException"></exception>
        static string MakeRelative(string fromDirectory, string toPath)
        {
            if (fromDirectory == null)
                throw new ArgumentNullException("fromDirectory");

            if (toPath == null)
                throw new ArgumentNullException("toPath");

            bool isRooted = (Path.IsPathRooted(fromDirectory) && Path.IsPathRooted(toPath));

            if (isRooted)
            {
                bool isDifferentRoot = (string.Compare(Path.GetPathRoot(fromDirectory), Path.GetPathRoot(toPath), true) != 0);

                if (isDifferentRoot)
                    return toPath;
            }

            List<string> relativePath = new List<string>();
            string[] fromDirectories = fromDirectory.Split(Path.DirectorySeparatorChar);

            string[] toDirectories = toPath.Split(Path.DirectorySeparatorChar);

            int length = Math.Min(fromDirectories.Length, toDirectories.Length);

            int lastCommonRoot = -1;

            // find common root
            for (int x = 0; x < length; x++)
            {
                if (string.Compare(fromDirectories[x], toDirectories[x], true) != 0)
                    break;

                lastCommonRoot = x;
            }

            if (lastCommonRoot == -1)
                return toPath;

            // add relative folders in from path
            for (int x = lastCommonRoot + 1; x < fromDirectories.Length; x++)
            {
                if (fromDirectories[x].Length > 0)
                    relativePath.Add("..");
            }

            // add to folders to path
            for (int x = lastCommonRoot + 1; x < toDirectories.Length; x++)
            {
                relativePath.Add(toDirectories[x]);
            }

            // create relative path
            string[] relativeParts = new string[relativePath.Count];
            relativePath.CopyTo(relativeParts, 0);

            string newPath = string.Join(Path.DirectorySeparatorChar.ToString(), relativeParts);

            return newPath;
        }
        static string MakeAbsolute(string fromPath, string toPath)
        {
            string temp = Path.Combine(fromPath, toPath);
            return Path.GetFullPath(temp);
        }

        static void Main(string[] args)
        {
            string pImageRelativePath = MakeRelative(CONFIG_PATH, IMAGE_PATH);
            // ..\Resource\Img1.png
            Console.WriteLine("图片文件的相对路径为:{0}", pImageRelativePath);
            
            string pImageAbsolutePath = MakeAbsolute(CONFIG_PATH, pImageRelativePath);
            //C:\SoftWare\Resource\Img1.png
            Console.WriteLine("图片文件的绝对路径为:{0}", pImageAbsolutePath);

            string pDataRelativeDir = MakeRelative(CONFIG_PATH, DATA_DIR);
            // ..\Data
            Console.WriteLine("数据文件夹的相对路径:{0}", pDataRelativeDir);

            string pDataAbsoluteDir = MakeAbsolute(CONFIG_PATH, pDataRelativeDir);
            // C:\SoftWare\Data
            Console.WriteLine("数据文件夹的绝对路径:{0}", pDataAbsoluteDir);
        }


    }

Guess you like

Origin http://43.154.161.224:23101/article/api/json?id=324693558&siteId=291194637