[c#] Windows 응용 프로그램에서 상대 경로를 절대 경로로 변환하는 방법은 무엇입니까?
Windows 응용 프로그램에서 상대 경로를 절대 경로로 어떻게 변환합니까?
ASP.NET에서 server.MapPath ()를 사용할 수 있다는 것을 알고 있습니다. 그러나 Windows 응용 프로그램에서 무엇을 할 수 있습니까?
내 말은, 그것을 처리 할 수있는 .NET 내장 함수가 있다면 …
답변
시도해 보셨습니까?
string absolute = Path.GetFullPath(relative);
? 실행 파일이 포함 된 디렉토리가 아니라 프로세스의 현재 작업 디렉토리를 사용합니다. 그래도 도움이되지 않으면 질문을 명확히하십시오.
답변
.exe에 상대적인 경로를 얻으려면 다음을 사용하십시오.
string absolute = Path.Combine(Application.ExecutablePath, relative);
답변
이것은 다른 드라이브의 경로, 드라이브 상대 경로 및 실제 상대 경로에 대해 작동합니다. basePath
실제로 절대적이지 않아도 작동합니다 . 항상 현재 작업 디렉토리를 최종 폴백으로 사용합니다.
public static String GetAbsolutePath(String path)
{
return GetAbsolutePath(null, path);
}
public static String GetAbsolutePath(String basePath, String path)
{
if (path == null)
return null;
if (basePath == null)
basePath = Path.GetFullPath("."); // quick way of getting current working directory
else
basePath = GetAbsolutePath(null, basePath); // to be REALLY sure ;)
String finalPath;
// specific for windows paths starting on \ - they need the drive added to them.
// I constructed this piece like this for possible Mono support.
if (!Path.IsPathRooted(path) || "\\".Equals(Path.GetPathRoot(path)))
{
if (path.StartsWith(Path.DirectorySeparatorChar.ToString()))
finalPath = Path.Combine(Path.GetPathRoot(basePath), path.TrimStart(Path.DirectorySeparatorChar));
else
finalPath = Path.Combine(basePath, path);
}
else
finalPath = path;
// resolves any internal "..\" to get the true full path.
return Path.GetFullPath(finalPath);
}
답변
조금 오래된 주제이지만 누군가에게 유용 할 수 있습니다. 비슷한 문제를 해결했지만 제 경우에는 경로가 텍스트 시작 부분에 있지 않았습니다.
그래서 여기 내 해결책이 있습니다.
public static class StringExtension
{
private const string parentSymbol = "..\\";
private const string absoluteSymbol = ".\\";
public static String AbsolutePath(this string relativePath)
{
string replacePath = AppDomain.CurrentDomain.BaseDirectory;
int parentStart = relativePath.IndexOf(parentSymbol);
int absoluteStart = relativePath.IndexOf(absoluteSymbol);
if (parentStart >= 0)
{
int parentLength = 0;
while (relativePath.Substring(parentStart + parentLength).Contains(parentSymbol))
{
replacePath = new DirectoryInfo(replacePath).Parent.FullName;
parentLength = parentLength + parentSymbol.Length;
};
relativePath = relativePath.Replace(relativePath.Substring(parentStart, parentLength), string.Format("{0}\\", replacePath));
}
else if (absoluteStart >= 0)
{
relativePath = relativePath.Replace(".\\", replacePath);
}
return relativePath;
}
}
예:
Data Source=.\Data\Data.sdf;Persist Security Info=False;
Data Source=..\..\bin\Debug\Data\Data.sdf;Persist Security Info=False;