Visual Studio에서 파일의 상대 경로를 얻는 방법은 무엇입니까?


82

Visual Studio의 솔루션 탐색기에서 추가 한 이미지 파일의 경로를 얻으려고하는데 해당 이미지의 상대 경로를 가져올 수 없습니다. H는 내 프로젝트의 파일 구조입니다.

/ BulutDepoProject
    / FolderIcon
        Folder.ico
        Main.cs

다음과 같은 이미지를 얻을 수 있습니다.

"C:\\Users\\Tolga\\Desktop\\BulutDepo\\BulutDepoProject\\FolderIcon\\Folder.ico" 

그러나 다음과 같은 것으로 얻을 수 있어야합니다.

"~\\FolderIcon\\Folder.ico"

나는 그것의 정확한 구문을 모르기 때문에 이미지를 가져올 수 없습니다. :(


당신은 이것을 확인해야합니다 => stackoverflow.com/questions/6895457/…
MarcD

답변:


54

모든 종류의 외부 파일을 사용하려는 경우 프로젝트 내의 폴더에 파일을 넣는 방법이 있지만 리소스에서 가져 오는 것만 큼 유효하지는 않습니다. 일반 Visual Studio 프로젝트에서는 섹션 Resources.resx아래 에 파일 이 있어야합니다 Properties. 그렇지 않은 경우 자신의 Resource.resx파일을 쉽게 추가 할 수 있습니다 . 그리고 여기에 모든 종류의 파일을 추가하면 여기에서 프로젝트에 리소스 파일을 추가하는 방법을 확인할 수 있습니다 .

프로젝트에 리소스 파일이 있으면 다음과 같이 쉽게 호출 할 수 있습니다.

var myIcon = Resources.MyIconFile;

물론 다음 using Properties과 같은 문을 추가해야합니다 .

using <namespace>.Properties;

4
@ christo8989 OP는 어쨌든 이미지 파일 에 관한 readonly것이므로 ....
Jesse Chisholm

37

나는 조금 늦었고 이것이 당신이 찾고있는 것인지 확실하지 않지만 다른 누군가가 유용하다고 생각할 경우를 대비하여 추가 할 것이라고 생각했습니다.

이것이 파일 구조라고 가정합니다.

/BulutDepoProject
    /bin
        Main.exe
    /FolderIcon
        Folder.ico
        Main.cs

Main.exe파일에 상대적인 경로를 작성해야 합니다. 그래서, 당신은 액세스하려는 Folder.ico사용자에, Main.cs당신은 사용할 수 있습니다 :

String path = "..\\FolderIcon\\Folder.ico"

그것은 나를 위해 일하는 것 같았습니다!


1
참조되는 파일이 솔루션의 다른 프로젝트에서 관리되기 때문에 이것은 내 경우에 더 나은 솔루션입니다. 구문이 단일 점도 지원하지 않습니까? string path = ".\\FileName.txt"
크리스토퍼 J. 그레이스

1
이것은 끔찍한 솔루션입니다. 사용하지 마십시오. "디버그"시나리오에서 현재 작업 디렉토리가 <Project>/Debug VS 디버그 환경에서 작동하기 때문에 작동합니다. 그러나 IDE에서 나가거나 다른 작업 디렉토리에서 EXE를 실행하면 확실히 중단됩니다.
Tomer W

25

"~ \"생략 :

var path = @"FolderIcon\Folder.ico";

~\파일 시스템 측면에서 의미가 없습니다. 내가 올바르게 사용하는 유일한 곳은 웹 앱에서 ASP.NET이 물결표를 응용 프로그램의 루트에 대한 절대 경로로 대체하는 곳입니다.

일반적으로 경로는 EXE가있는 폴더에 상대적이라고 가정 할 수 있습니다. 또한 Visual Studio의 속성 탭에서 이미지가 "콘텐츠"및 "최신 인 경우 복사"/ "항상 복사"로 지정되어 있는지 확인합니다.


유닉스 / 리눅스에서 '~'는 "홈 디렉토리"의 동의어입니다.
Nyerguds

1
@Nyerguds 예. 그러나 슬래시는 잘못된 방법이며이 질문은 특히이 질문이 게시 된 2012 년에 Linux와 실제로 호환되지 않는 "Visual Studio"태그가 지정되었습니다.
3Dave

"일반적으로 경로가 EXE가있는 폴더에 상대적이라고 가정 할 수 있습니다."<< 매우 사실이 아닙니다! Windows에서 EXE를 두 번 클릭하면 작업 디렉토리는 실행 파일 위치가 아니라 사용자의 개인 위치입니다!
Tomer W

@TomerW 실행 파일을 두 번 클릭하는 것 외에 여러 가지 방법으로 실행할 수 있습니다.
3Dave

맞습니다.하지만 ... 가장 일반적인 Dblclick을 포함하여 응용 프로그램은 모든 방식으로 작동해야합니다.
Tomer W

17

나는 또한 같은 문제를 만났고 그것을 극복 할 수 있었다. 그래서 제가 적용한 단계를 설명하겠습니다. 시나리오에 따라 설명하겠습니다.

내 방법에 따라 상대 경로를 얻으려면 'Path'클래스와 'Assembly'클래스를 사용해야합니다.

먼저 using 문에서 System.IO 및 System.Reflection을 가져옵니다.

그런 다음 아래 주어진 코드 줄을 입력하십시오.

        var outPutDirectory = Path.GetDirectoryName(Assembly.GetExecutingAssembly(). CodeBase);

실제로 주어진 행 위에는 프로젝트의 출력 디렉토리 경로가 저장됩니다 (여기서 '출력'디렉토리는 프로젝트 의 Debug 폴더를 나타냄).

이제 FolderIcon 디렉토리를 Debug 폴더에 복사하십시오. 그런 다음 아래 주어진 줄을 입력하십시오.

var iconPath = Path.Combine(outPutDirectory, "FolderIcon\\Folder.ico");

이제이 'iconPath'변수에는 Folder.ico의 전체 경로가 포함됩니다. 당신이해야 할 일은 그것을 문자열 변수에 저장하는 것입니다. 이를 위해 아래 코드 줄을 사용하십시오.

string icon_path = new Uri(iconPath ).LocalPath;

이제이 icon_path 문자열 변수를 아이콘에 대한 상대 경로로 사용할 수 있습니다.

감사.


1
file:경로 앞에 왜
Kolob Canyon

2
그것은 .NET 어셈블리의 URI 다양한 실행 할 수 있기 때문입니다뿐만 아니라 디스크 (COM은 기타, RPC, ... 개체) 당신은 사용할 수 있습니다에서 @KolobCanyon Assembly.GetExecutingAssembly().Location당신은 당신이 파일 (EXE / DLL)를 다루는 경우
Tomer W

3

이것을 사용하는 것이 가장 쉬울 것이라고 생각합니다

new Uri("pack://application:,,/FolderIcon/" + youImageICO);

또는이 코드는 폴더가 루트 프로젝트에있는 모든 컴퓨터에서 작동합니다. 변경하려면이 섹션을 변경하십시오. @ ".. \"

public static string bingPathToAppDir(string localPath)
{
    string currentDir = Environment.CurrentDirectory;
    DirectoryInfo directory = new DirectoryInfo(
        Path.GetFullPath(Path.Combine(currentDir, @"..\..\" + localPath)));
    return directory.ToString();
}

2

Visual Studio의 솔루션 탐색기 창에서 'Folder.ico'파일을 클릭하십시오. 그러면 속성 창이 나타납니다. '출력 디렉터리로 복사'동작을 '최신 인 경우 복사'로 변경합니다. 그러면 Visual Studio가 파일을 출력 bin 디렉터리에 복사합니다.

이제 상대 경로를 사용하여 파일 경로를 얻으려면 다음을 입력하십시오.

string pathToIcoFile = AppDomain.CurrentDomain.BaseDirectory + "//FolderIcon//Folder.ico";

도움이 되었기를 바랍니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.