Как создать и разрешить относительные пути? - PullRequest
1 голос
/ 03 октября 2008

Мое приложение открывает файл в подкаталоге каталога, в котором оно выполняется, подкаталог называется sample и содержит файлы:

  • example.raf (пример расширения, незначительный)
  • background.gif

example.raf содержит относительный путь к background.gif (в этом случае только имя файла, потому что файлы находятся в том же каталоге, что и raf), а открытие RAF заставляет приложение читать и отображать background.gif.

Когда я использую OpenFileDialog для загрузки файла RAF, все в порядке, изображение загружается правильно. Я знаю, что диалог открытия файла каким-то образом изменяется в текущем рабочем каталоге, но я не смог воссоздать его без вызова диалога открытия файла

К сожалению, в случае, когда я вызываю raf read метод непосредственно из кода, без указания пути к форме файла OpenFileDialog, как это

LoadRAF("sample\\example.raf");

в этом случае у меня возникла проблема, приложение пытается загрузить изображение из ExecutablePath , а не из подкаталога, содержащего файл RAF и image . Конечно, это нормальное поведение, но в этом случае оно крайне нежелательно. Требуется обрабатывать относительные и абсолютные типы путей в моем приложении, так что я должен сделать, чтобы решить эту проблему, как изменить ExecutablePath или что-то еще, что я могу сделать, чтобы это работало по крайней мере, как в дело OpenFileDialog?

Ответы [ 3 ]

3 голосов
/ 17 ноября 2009

Следующий код из моего проекта ZipSolution (http://zipsolution.codeplex.com/) показывает, как разрешить и создать относительные пути в .net

using System;
using System.Collections.Generic;
using System.Text;
using System.IO;

namespace ZipSolution
{
    internal static class RelativePathDiscovery
    {
        /// <summary>
        /// Produces relative path when possible to go from baseLocation to targetLocation
        /// </summary>
        /// <param name="baseLocation">The root folder</param>
        /// <param name="targetLocation">The target folder</param>
        /// <returns>The relative path relative to baseLocation</returns>
        /// <exception cref="ArgumentNullException">base or target locations are null or empty</exception>
        public static string ProduceRelativePath(string baseLocation, string targetLocation)
        {
            if (string.IsNullOrEmpty(baseLocation))
            {
                throw new ArgumentNullException("baseLocation");
            }

            if (string.IsNullOrEmpty(targetLocation))
            {
                throw new ArgumentNullException("targetLocation");
            }

            if (!Path.IsPathRooted(baseLocation))
            {
                return baseLocation;
            }

            if (!Path.IsPathRooted(targetLocation))
            {
                return targetLocation;
            }

            if (string.Compare(Path.GetPathRoot(baseLocation), Path.GetPathRoot(targetLocation), true) != 0)
            {
                return targetLocation;
            }

            if (string.Compare(baseLocation, targetLocation, true) == 0)
            {
                return ".";
            }

            string resultPath = ".";

            if (!targetLocation.EndsWith(@"\"))
            {
                targetLocation = targetLocation + @"\";
            }

            if (baseLocation.EndsWith(@"\"))
            {
                baseLocation = baseLocation.Substring(0, baseLocation.Length - 1);
            }

            while (!targetLocation.StartsWith(baseLocation + @"\", StringComparison.OrdinalIgnoreCase))
            {
                resultPath = resultPath + @"\..";
                baseLocation = Path.GetDirectoryName(baseLocation);

                if (baseLocation.EndsWith(@"\"))
                {
                    baseLocation = baseLocation.Substring(0, baseLocation.Length - 1);
                }
            }

            resultPath = resultPath + targetLocation.Substring(baseLocation.Length);

            // preprocess .\ case
            return resultPath.Substring(2, resultPath.Length - 3);
        }

        /// <summary>
        /// Resolves the relative pathes
        /// </summary>
        /// <param name="relativePath">Relative path</param>
        /// <param name="basePath">base path for discovering</param>
        /// <returns>Resolved path</returns>
        public static string ResolveRelativePath(string relativePath, string basePath)
        {
            if (string.IsNullOrEmpty(basePath))
            {
                throw new ArgumentNullException("basePath");
            }

            if (string.IsNullOrEmpty(relativePath))
            {
                throw new ArgumentNullException("relativePath");
            }

            var result = basePath;

            if (Path.IsPathRooted(relativePath))
            {
                return relativePath;
            }

            if (relativePath.EndsWith(@"\"))
            {
                relativePath = relativePath.Substring(0, relativePath.Length - 1);
            }

            if (relativePath == ".")
            {
                return basePath;
            }

            if (relativePath.StartsWith(@".\"))
            {
                relativePath = relativePath.Substring(2);
            }

            relativePath = relativePath.Replace(@"\.\", @"\");
            if (!relativePath.EndsWith(@"\"))
            {
                relativePath = relativePath + @"\";
            }

            while (!string.IsNullOrEmpty(relativePath))
            {
                int lengthOfOperation = relativePath.IndexOf(@"\") + 1;
                var operation = relativePath.Substring(0, lengthOfOperation - 1);
                relativePath = relativePath.Remove(0, lengthOfOperation);

                if (operation == @"..")
                {
                    result = Path.GetDirectoryName(result);
                }
                else
                {
                    result = Path.Combine(result, operation);
                }
            }

            return result;
        }
    }
}
1 голос
/ 03 октября 2008

OpenFileDialog выделяет абсолютный путь за кулисами.

Если вы знаете расположение файла raf, вы можете сделать что-то вроде:

string parentPath = Directory.GetParent(rafFilePath);
string imagePath = Path.Combine(parentPath, imageFileNameFromRaf);

imagePath теперь будет содержать абсолютный путь к вашему изображению, полученный из имени изображения, содержащегося в файле raf, и каталог, в котором находился файл raf.

0 голосов
/ 17 ноября 2009

Вы можете попытаться изменить текущий каталог на каталог, содержащий ваш исполняемый файл, используя Environment.CurrentDirectory перед чтением по относительным путям. Или вместо этого, если у вас есть относительный путь (Path.IsPathRooted), вы можете объединить (Path.Combine) свой корневой каталог с относительным путем, чтобы иметь абсолютный путь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...