문제

다음 코드가 포함 된 C# 응용 프로그램이 있습니다.

string file = "relativePath.txt";

//Time elapses...

string contents = File.ReadAllText(file);

이것은 대부분의 시간에 잘 작동합니다. 파일은 앱이 시작된 디렉토리에 대해 읽습니다. 그러나 테스트에서 약 5 시간 동안 혼자 남겨두면 앱이 FileNotFoundException "C : 문서 및 설정 Adminstrator RelativePath.txt"라고 말할 수는 없습니다. 파일을 읽는 작업이 바로 실행되면 파일은 적절한 위치에서 읽습니다.

무엇을 제공합니까? 그리고 가장 좋은 수정은 무엇입니까? 파일을 해결합니다 Assembly.GetEntryAssembly().Location?

도움이 되었습니까?

해결책

파일이 항상 실행 가능한 어셈블리와 관련된 경로에있는 경우 예, Assembly.location을 사용하십시오. 나는 주로 Assembly를 사용합니다. getEntryAssembly 대신 해당되는 경우 getExecutingAsembly를 사용합니다. 즉, DLL에서 파일에 액세스하는 경우 경로는 DLL 경로와 관련이 있습니다.

다른 팁

길을 바꿀 수있는 으스스한 장소 중 하나는 OpenFiledialog입니다. 사용자는 폴더 사이를 탐색 할 때 응용 프로그램 디렉토리를 현재보고있는 것로 변경하고 있습니다. 사용자가 다른 디렉토리에서 대화 상자를 닫으면 해당 디렉토리에 갇히게됩니다.

그것은 호텔이라는 속성이 있습니다 복원 사원 대화 상자가 경로를 재설정하게합니다. 그러나 나는 기본값이 "거짓"이라고 생각합니다.

교훈은 상대적인 경로에 의존하지 않아야한다고 생각합니다. 오류가 발생하기 쉽습니다. 현재 디렉토리는 파일 대화 상자와 같이 실행중인 과정의 모든 것들에 의해 변경 될 수 있습니다 (변경을 방지하는 속성이 있지만). Application.StartupPath와 같은 알려진 경로에서 고정 된 경로를 생성하는 상대 경로 (Visual Studio에서 시작할 때주의하십시오) 또는 다른 알려진 경로.

상대 경로를 사용하면 프로젝트의 완전히 관련이없는 부분의 변화로 인해 코드가 유지하기가 어렵게 만들면 다른 부분이 실패 할 수 있습니다.

System. Environment에는 다음과 같습니다 스페셜 폴더 열거, 그것은 표준 상대 경로를 얻는 데 도움이됩니다.

이런 식으로 적어도 경로는 내부적으로 얻어지고 당신에게 전달됩니다. 따라서 시스템이 어떻게 든 경로를 바꾸면 코드가 처리되기를 바랍니다.

당신이 좋아하는 것처럼

> CD C : 폴더 1

C : 폴더 1> ../folder 2/theapplication.exe

응용 프로그램의 현재 작업 디렉토리는 C : 폴더 1입니다.

다음은 예제 프로그램입니다

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);
        }
    }
}

visurestudio에서 이것을 빌드 한 다음 디버그/빈 디렉토리에서 명령 프롬프트를 열고

빈/디버그> cwd.exe

그럼

빈/디버그> CD ../../> bin/debug/cwd.exe

시작 경로의 차이를 볼 수 있습니다.

원래 질문과 관련하여 ... "약 5 시간 동안 혼자 남겨두면 앱이 filenotfoundException을 던질 것입니다."

응용 프로그램이 실행되면 예상 위치에서 해당 파일 만 이동하거나 제거하면이 오류가 발생합니다.

그렉

OpenFileDialog를 사용하고 기억 경로 속성 (정확한 이름에 대해 확실하지 않음)이 사실이라면 현재 디렉토리를 변경합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top