2008-10-01 5 views
2

는 다음 코드를 포함하는 C# 응용 프로그램이 있습니다실행중인 응용 프로그램의 현재 디렉토리가 변경 될 수 있습니까?

string file = "relativePath.txt"; 

//Time elapses... 

string contents = File.ReadAllText(file); 

이 잘 작동, 대부분의 시간. 파일은 앱이 시작된 디렉토리를 기준으로 읽습니다. 그러나 테스트에서 약 5 시간 동안 방치하면 "C : \ Documents and Settings \ Adminstrator \ relativePath.txt"를 찾을 수 없다는 메시지가 FileNotFoundException으로 표시됩니다. 그래도 파일을 읽는 작업이 즉시 실행되면 적절한 위치에서 파일을 읽습니다.이 파일은 "C : \ foo \ relativePath.txt"라고합니다.

무엇이 제공됩니까? 그리고, 최선의 해결책은 무엇입니까? 파일을 Assembly.GetEntryAssembly().Location에 대해 해결 하시겠습니까?

+0

응용 프로그램을 시작한 디렉토리가 현재 작업 디렉토리로로드됩니다. 이것을 완벽하게 허용 할 수 있습니다. 그리고 코드의 모호한 부분이 이것을하면, 당신은 결국이 행동을 끝낼 것입니다. 상대 경로를 절대 경로로 변환합니다. – workmad3

답변

5

파일이 항상 실행 가능 어셈블리와 관련된 경로에 있으면 예, Assembly.Location을 사용하십시오. Assembly.GetExecutingAssembly 대신 Assembly.GetExecutingAssembly를 사용합니다. 즉, DLL에서 파일에 액세스하는 경우 경로는 DLL 경로를 기준으로합니다.

+0

원래 GetExecutingAssembly를 사용하고 있었지만, 생각해 보았을 때 실행 파일의 경로와 관련이 있기를 원했습니다. 실행 파일의 구성 파일에 경로가 정의되어 있기 때문입니다. 또한 경로가 절대 시작되지 않는 경우에만 해결할 것입니다 ... –

+0

Path.Combine (Assembly [whatever] .Location, relativePath)을 사용할 수 있습니다. relativePath가 절대 경로이면 Path.Combine은 절대 경로를 반환하고 첫 번째 매개 변수를 무시합니다. – OregonGhost

+0

비록, erm, Path.Combine에 전달하기 전에 위치의 exe 파일 이름을 제거해야한다고 생각합니다. – OregonGhost

2

나는 수업이 상대 경로에 의존해서는 안되며 오류가 발생하기 쉽다고 생각한다. 현재 디렉토리는 파일 대화 상자와 같이 실행중인 프로세스의 여러 항목에 의해 변경 될 수 있습니다 (변경하지 못하도록하는 속성이 있음에도 불구하고). 따라서 사용자가 파일을 사용하지 않는 한 상대 경로가 항상 어디로 이어질지를 절대 보장 할 수 없습니다. Application.StartupPath (Visual Studio에서 시작할 때 조심스럽게) 또는 다른 알려진 경로와 같은 알려진 경로에서 고정 경로를 생성하는 상대 경로입니다.

상대 경로를 사용하면 프로젝트에서 전혀 관련이없는 부분의 변경으로 인해 다른 부분이 실패 할 수 있으므로 코드를 유지 관리하기가 어려워집니다.

7

경로를 변경할 수있는 유령의 장소는 OpenFileDialog입니다. 사용자가 폴더 사이를 탐색 할 때 응용 프로그램 디렉토리가 현재보고있는 폴더로 변경됩니다. 사용자가 다른 디렉토리에서 대화 상자를 닫으면 해당 디렉토리에 멈추게됩니다.

RestoreDirectory이라는 속성이있어 대화 상자가 경로를 재설정합니다. 하지만 기본값은 "거짓"이라고 생각합니다.

+0

한 가지 방법은 설치 경로의 어딘가에 (예 : 설치의 일부로) 응용 프로그램 루트 경로를 저장 한 다음 코드 전체에서 app_root_path \ SomePath를 사용하십시오. – Gishu

0

openfiledialog를 사용하고 기억 경로 속성 (정확한 이름이 확실하지 않음)이 true이면 내가 생각하는 현재 디렉토리가 변경됩니다.

1

System.Environment에는 표준 상대 경로를 얻는 데 도움이되는 SpecialFolder 열거 형이 있습니다.

최소한이 경로는 내부적으로 전달되어 다시 전달되므로 시스템이 경로를 어떻게 든 변경하면 코드가 처리하게되기를 바랍니다.

1

당신이 할 경우

> CD를 C와 같은 somehting : \ 폴더 1

C : \ 폴더 1> ../folder 2/theApplication.exe

applicaiton의 현재 작업 디렉토리 c : \ folder가됩니다.여기

는 할> CWD.exe

다음 디버그/bin 디렉토리에서 명령 프롬프트를 열고

빈/디버그를 수행으로 VisualStudio의 예제 프로그램

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Windows.Forms; 

namespace CWD { 
    class Program { 
     static void Main (string[] args) { 
      Console.WriteLine(Application.StartupPath); 
     } 
    } 
} 

빌드이있다

bin/debug> cd ../../ bin/debug/CWD.exe

시작 경로의 차이가 나타납니다. 원래의 질문과 관련

... 응용 프로그램이 실행 만 이동 또는 예상에서 해당 파일을 제거하면

"약 5 시간 방치하면 앱이 FileNotFoundException이 발생합니다" 위치가이 오류를 발생시켜야합니다.

greg

관련 문제