Jak uzyskać względną ścieżkę pliku w Visual Studio?

82

Próbuję uzyskać ścieżkę do pliku obrazu, który dodałem w eksploratorze rozwiązań w programie Visual Studio, ale nie mogłem uzyskać względnej ścieżki tego obrazu. H to struktura plików mojego projektu:

/ BulutDepoProject
    / FolderIcon
        Folder.ico
        Main.cs

Mogę uzyskać taki obraz:

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

Ale powinienem być w stanie uzyskać to za pomocą czegoś takiego:

"~\\FolderIcon\\Folder.ico"

Chyba nie znam dokładnej składni, więc nie mogę pobrać obrazu. :(

Tolga Evcimen
źródło

Odpowiedzi:

54

W przypadku, gdy chcesz użyć dowolnego rodzaju pliku zewnętrznego, z pewnością istnieje sposób na umieszczenie go w folderze w projekcie, ale nie tak ważny, jak pobranie ich z zasobów. W zwykłym projekcie programu Visual Studio powinieneś mieć Resources.resxplik w Propertiessekcji, jeśli nie, możesz łatwo dodać własny Resource.resxplik. I dodaj do niego dowolny rodzaj pliku, możesz przejść do przewodnika dodawania plików zasobów do projektu tutaj .

Po umieszczeniu plików zasobów w projekcie wywołanie ich jest proste:

var myIcon = Resources.MyIconFile;

Oczywiście należy dodać takie using Propertiesstwierdzenie:

using <namespace>.Properties;
Tolga Evcimen
źródło
4
@ christo8989 OP dotyczy pliku obrazu , który i readonlytak będzie , więc ...
Jesse Chisholm
38

Trochę się spóźniłem i nie jestem pewien, czy tego właśnie szukasz, ale pomyślałem, że dodam to na wypadek, gdyby ktoś inny uznał to za przydatne.

Załóżmy, że to jest twoja struktura plików:

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

Musisz wpisać swoją ścieżkę względem Main.exepliku. Więc chcesz uzyskać dostęp Folder.ico, w swoim Main.csmożesz użyć:

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

To wydawało się działać dla mnie!

AdamInTheOculus
źródło
1
Jest to lepsze rozwiązanie w moim przypadku, ponieważ plik, do którego się odwołujemy, jest zarządzany przez inny projekt w rozwiązaniu. Czy składnia nie obsługuje również pojedynczej kropki? string path = ".\\FileName.txt"
Christopher J. Grace
1
To jest okropne rozwiązanie, nie używaj tego ... to działa tylko dlatego, że w scenariuszu "Debugowanie" twój bieżący katalog roboczy <Project>/Debug działa w środowisku VS Debug. Ale jeśli wyjdziesz z IDE ... lub uruchomisz EXE z innego katalogu roboczego, na pewno się zepsuje.
Tomer W
25

Pomiń „~ \”:

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

~\nie ma żadnego znaczenia w zakresie systemu plików. Jedyne miejsce, które widziałem, że jest poprawnie używane, to aplikacja internetowa, w której ASP.NET zastępuje tyldę bezwzględną ścieżką do katalogu głównego aplikacji.

Zwykle można założyć, że ścieżki są względne w stosunku do folderu, w którym znajduje się plik EXE. Upewnij się również, że obraz jest określony jako „zawartość” i „kopiuj, jeśli nowszy” / „kopiuj zawsze” na karcie właściwości w programie Visual Studio.

3Dave
źródło
W unix / linux, „~” jest synonimem „katalogu domowego”.
Nyerguds
1
@Nyerguds yes. Jednak ukośnik jest niewłaściwy i to pytanie jest oznaczone jako „Visual Studio”, co nie jest tak naprawdę zgodne z Linuksem, szczególnie w 2012 roku, kiedy to pytanie zostało opublikowane.
Zapisz
„Zazwyczaj można założyć, że ścieżki są względne w stosunku do folderu, w którym znajduje się plik EXE” << Bardzo nieprawda! po dwukrotnym kliknięciu pliku EXE w systemie Windows katalog roboczy jest prywatną lokalizacją użytkownika, a NIE lokalizacją pliku wykonywalnego!
Tomer W
@TomerW Jest wiele sposobów na uruchomienie pliku wykonywalnego poza dwukrotnym kliknięciem.
Zapisz
Prawidłowo, jednak ... aplikacja powinna działać na każdy sposób, w tym Dblclick, który jest moim zdaniem najbardziej powszechny.
Tomer W
17

Spotkałem też ten sam problem i udało mi się go przezwyciężyć. Pozwól więc, że wyjaśnię kroki, które zastosowałem. Wyjaśnię to według twojego scenariusza.

Zgodnie z moją metodą musimy użyć klasy „Path” i „Assembly”, aby uzyskać ścieżkę względną.

A więc najpierw Import System.IO i System.Reflection w używaniu instrukcji.

Następnie wpisz poniższą podaną linię kodu.

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

Właściwie powyższa linia przechowuje ścieżkę do katalogu wyjściowego twojego projektu (tutaj katalog 'output' odnosi się do folderu Debug twojego projektu).

Teraz skopiuj katalog FolderIcon do folderu Debug. Następnie wpisz poniższą podaną linię.

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

Teraz ta zmienna „iconPath” zawiera całą ścieżkę do twojego Folder.ico. Wszystko, co musisz zrobić, to zapisać go w zmiennej łańcuchowej. W tym celu użyj poniższego wiersza kodu.

string icon_path = new Uri(iconPath ).LocalPath;

Teraz możesz użyć tej zmiennej łańcuchowej icon_path jako względnej ścieżki do ikony.

Dzięki.

George T.
źródło
1
dlaczego jest file:przed ścieżką
Kolob Canyon
2
@KolobCanyon Dzieje się tak, ponieważ zestawy .NET można uruchamiać z różnych identyfikatorów URI, a nie tylko z dysku (obiekty COM, RPC, itp.) Możesz użyć, Assembly.GetExecutingAssembly().Locationjeśli masz do czynienia z plikiem (EXE / DLL)
Tomer W
3

Myślę, że użycie tego będzie najłatwiejsze

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

lub ten kod będzie działał na każdym komputerze, którego folder jest w projekcie głównym, jeśli chcesz go zmienić ... po prostu zmień tę sekcję @ ".. \"

public static string bingPathToAppDir(string localPath)
{
    string currentDir = Environment.CurrentDirectory;
    DirectoryInfo directory = new DirectoryInfo(
        Path.GetFullPath(Path.Combine(currentDir, @"..\..\" + localPath)));
    return directory.ToString();
}
Fotoniczne
źródło
2

W programie Visual Studio kliknij plik „Folder.ico” w okienku Eksplorator rozwiązań. Następnie zobaczysz panel Właściwości. Zmień zachowanie „Kopiuj do katalogu wyjściowego” na „Kopiuj, jeśli nowszy”. Spowoduje to, że program Visual Studio skopiuje plik do wyjściowego katalogu bin.

Teraz, aby uzyskać ścieżkę do pliku przy użyciu ścieżki względnej, po prostu wpisz:

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

Mam nadzieję, że to pomogło.

Marcin
źródło