2008-11-12 2 views
0

응용 프로그램 루트를 기준으로 이미지 폴더가있는 응용 프로그램에서 작업하고 있습니다. 속성 -> 설정 디자이너에서이 상대 경로를 지정할 수 있어야합니다. "\ 이미지 \". 내가 겪고있는 문제는 Environment.CurrentDirectory가 OpenFileDialog를 통해 변경되면 상대 경로가 올바른 위치로 해석되지 않는다는 것입니다. 설정 파일에서 현재 디렉토리가 아닌 응용 프로그램 디렉토리에서 항상 시작한다는 의미의 경로를 지정하는 방법이 있습니까? 나는 항상 상대 경로의 앞쪽으로 응용 프로그램 경로를 동적으로 연결할 수 있지만 내 설정 속성이 자체적으로 해결할 수 있기를 바랍니다..NET 설정 상대 경로

답변

1

필자가 아는 한이 유형의 경로 분석을 허용하는 기본 제공 기능은 없습니다. 가장 좋은 방법은 디렉토리를 실행하는 응용 프로그램을 동적으로 결정하고 이미지 경로에 연결하는 것입니다. 특별히 언급 한 이유로 Environment.CurrentDirectory을 사용하고 싶지는 않습니다. 현재 디렉토리가이 상황에 맞지 않을 수도 있습니다.

public string ExecutingAssemblyPath() 
{ 
    Assembly actualAssembly = Assembly.GetEntryAssembly(); 
    if (this.actualAssembly == null) 
    { 
     actualAssembly = Assembly.GetCallingAssembly(); 
    } 
    return actualAssembly.Location; 
} 
+0

버그를 닮은'this.'가 있습니다. 어떤 상황에서 실제로'if' 문이 필요합니까? BTW, 개념적 호출자가 런타임에 의해 인라인 될 경우'GetCallingAssembly'는 놀라운 일을 할 수 있다는 점에 유의하십시오. 나는 그 이유 때문에 그 방법을 피하고 간단히 대신'Type'을 사용하여 어셈블리를 검색합니다. 적어도 안전합니다. –

0

2 옵션 :

  • 의 디렉토리에 대한 설정을 해결할 수있는 설정을 사용하는 코드

    나는 실행 조립 위치를 찾으려면 발견했습니다 가장 안전한 코드는 이것이다 현재 실행중인 어셈블리.

  • 실행중인 어셈블리와 관련된 문자열로 직렬화하고 현재 실행중인 어셈블리의 디렉터리에 대해 확인되는 전체 경로에 대한 접근자를 갖는 고유 한 형식을 만들 수 있습니다.

코드 샘플 :

string absolutePath = Settings.Default.ImagePath; 
if(!Path.IsPathRooted(absolutePath)) 
{ 
    string root = Assembly.GetEntryAssembly().Location; 
    root = Path.GetDirectoryName(root); 
    absolutePath = Path.Combine(root, absolutePath); 
} 

이 코드의 좋은 점은 설정에 완전한 경로 또는 상대 경로를 수 있다는 것입니다. 경로가 다른 어셈블리를 기준으로해야하는 경우 사용하는 어셈블리 위치를 변경할 수 있습니다. GetExecutingAssembly()은 실행중인 코드가있는 어셈블리의 위치를 ​​알려주고 옵션 2를 사용하면 GetCallingAssembly()이 좋습니다.

1

Application.ExecutablePath를 찾으십니까? 응용 프로그램의 실행 파일이 어디에 있는지 알려주고 실행 파일 이름을 제거한 다음 경로를 추가해야합니다.

+0

Windows Forms 응용 프로그램 인 경우에만 작동합니다. 또한 실행 파일 이름을 포함하여 응용 프로그램을 시작한 실행 파일의 경로를 반환하므로 경로 부분 만 제거해야합니다. –

+0

Environment.CurrentDirectory에 대한 언급으로 인해 .NET 응용 프로그램이라는 가정을했습니다. –

+0

.NET! = WinForms –

0

이 모두 윈폼에서 제대로 작동하고 ASP.NET합니다 (설정 파일의 경로 제공) : Windows 및 콘솔 응용 프로그램의

new System.IO.FileInfo(AppDomain.CurrentDomain.SetupInformation.ConfigurationFile).Directory; 

을, 확실한 방법은 사용하는 것입니다 :

아래와 같이
0

I suggest you

Application.StartupPath 
는 Assembly.CodeBase를 사용하려면,

public static string RealAssemblyFilePath() 
{ 
    string dllPath=Assembly.GetExecutingAssembly().CodeBase.Substring(8); 
    return dllPath; 
} 
,

Application.ExecutablePath을 시도 할 수 있습니다. 그러나 System.Windows.Forms를 참조해야합니다. 클래스 라이브러리가 양식 및 UI 항목을 명확하게 처리하도록하려면이 방법이 바람직하지 않을 수 있습니다.

Assembly.GetExecutingAssembly().Location을 사용해보세요. 그러나 (기본 NUnit 동작처럼) 응용 프로그램을 실행하기 전에 "그림자 복사"를 수행하면이 속성은 실제 실제 위치가 아닌 섀도 복사본 위치를 반환합니다.

가장 좋은 방법은 Assembly 개체의 CodeBase 속성을 호출하고 관련없는 문자열 부분을 잘라내는 함수를 구현하는 것입니다.

0

나는 그와 함께하기 위해 다음과 같은 두 가지 방법을 사용하십시오

public static IEnumerable<DirectoryInfo> ParentDirs(this DirectoryInfo dir) { 
    while (dir != null) { 
     yield return dir; 
     dir = dir.Parent; 
    } 
} 
public static DirectoryInfo FindDataDir(string relpath, Assembly assembly) { 
    return new FileInfo((assembly).Location) 
     .Directory.ParentDirs() 
     .Select(dir => Path.Combine(dir.FullName + @"\", relpath)) 
     .Where(Directory.Exists) 
     .Select(path => new DirectoryInfo(path)) 
     .FirstOrDefault(); 
} 

다양한 빌드 스크립트가 bin\x64\Release\NonsensePath\ 같은 디렉토리에 일을 고집 끝날 때 개발 과정에서 사용 용이로하는 부모 DIRS 보는 이유.