Wie erhalte ich den relativen Pfad einer Datei in Visual Studio?

82

Ich versuche, den Pfad einer Bilddatei abzurufen, die ich im Solution Explorer in Visual Studio hinzugefügt habe, aber ich konnte den relativen Pfad dieses Bildes nicht ermitteln. H ist die Dateistruktur meines Projekts:

/ BulutDepoProject
    / FolderIcon
        Folder.ico
        Main.cs

Ich kann das Bild so bekommen:

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

Aber ich sollte in der Lage sein, es mit so etwas wie:

"~\\FolderIcon\\Folder.ico"

Ich glaube, ich kenne die genaue Syntax nicht, daher kann ich das Bild nicht abrufen. :(

Tolga Evcimen
quelle

Antworten:

54

Wenn Sie eine externe Datei verwenden möchten, gibt es sicherlich eine Möglichkeit, sie in einem Ordner in Ihrem Projekt abzulegen, die jedoch nicht so gültig ist wie das Abrufen aus Ressourcen. In einem normalen Visual Studio-Projekt sollten Sie eine Resources.resxDatei unter dem PropertiesAbschnitt haben. Andernfalls können Sie problemlos Ihre eigene Resource.resxDatei hinzufügen . Und fügen Sie jede Art von Datei in ihm können Sie den Lösungsweg erreichen für das Hinzufügen von Ressourcen - Dateien zu einem Projekt hier .

Nachdem Sie Ressourcendateien in Ihrem Projekt haben, ist das Aufrufen wie folgt einfach:

var myIcon = Resources.MyIconFile;

Natürlich sollten Sie die using PropertiesAussage wie folgt hinzufügen :

using <namespace>.Properties;
Tolga Evcimen
quelle
4
@ christo8989 Das OP handelt von einer Bilddatei , die readonlysowieso sein wird, also ....
Jesse Chisholm
38

Ich bin etwas spät dran und nicht sicher, ob Sie danach suchen, aber ich dachte, ich würde es hinzufügen, nur für den Fall, dass jemand anderes es nützlich findet.

Angenommen, dies ist Ihre Dateistruktur:

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

Sie müssen Ihren Pfad relativ zur Main.exeDatei schreiben . Also, wollen Sie zugreifen Folder.ico, in der Main.csSie verwenden können:

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

Das schien bei mir zu funktionieren!

AdamInTheOculus
quelle
1
Dies ist in meinem Fall eine bessere Lösung, da die Datei, auf die verwiesen wird, von einem anderen Projekt in der Lösung verwaltet wird. Unterstützt die Syntax nicht auch einen einzelnen Punkt? string path = ".\\FileName.txt"
Christopher J. Grace
1
Dies ist eine schreckliche Lösung. Verwenden Sie das nicht ... dies funktioniert nur, weil im "Debug" -Szenario Ihr aktuelles Arbeitsverzeichnis <Project>/Debug daher für die VS Debug-Umgebung funktioniert. Aber wenn Sie die IDE verlassen ... oder die EXE von einem anderen Arbeitsverzeichnis aus ausführen, wird sie sicherlich kaputt gehen.
Tomer W
25

Lassen Sie das "~ \" weg:

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

~\bedeutet nichts in Bezug auf das Dateisystem. Der einzige Ort, an dem ich gesehen habe, dass er korrekt verwendet wird, ist eine Webanwendung, in der ASP.NET die Tilde durch den absoluten Pfad zum Stammverzeichnis der Anwendung ersetzt.

Sie können normalerweise davon ausgehen, dass die Pfade relativ zu dem Ordner sind, in dem sich die EXE befindet. Stellen Sie außerdem sicher, dass das Bild auf der Registerkarte "Eigenschaften" in Visual Studio als "Inhalt" und "Kopieren, wenn neuer" / "Immer kopieren" angegeben ist.

3Dave
quelle
Unter Unix / Linux ist '~' ein Synonym für "Home Directory".
Nyerguds
1
@Nyerguds ja. Der Schrägstrich ist jedoch falsch und diese Frage trägt den Tag "Visual Studio", was nicht wirklich mit Linux kompatibel ist, insbesondere 2012, als diese Frage veröffentlicht wurde.
3Dave
"Normalerweise können Sie davon ausgehen, dass die Pfade relativ zu dem Ordner sind, in dem sich die EXE befindet." << Sehr, nicht wahr! Wenn Sie in Windows auf eine EXE-Datei doppelklicken, ist das Arbeitsverzeichnis der private Speicherort des Benutzers und NICHT der ausführbare Speicherort!
Tomer W
@TomerW Es gibt viele andere Möglichkeiten, eine ausführbare Datei auszuführen, als darauf zu doppelklicken.
3Dave
Richtig, aber ... eine Anwendung sollte in jeder Hinsicht funktionieren, einschließlich Dblclick, das meiner Meinung nach am häufigsten vorkommt.
Tomer W
17

Ich bin auch auf das gleiche Problem gestoßen und konnte es durchstehen. Lassen Sie mich die Schritte erklären, die ich angewendet habe. Ich werde es gemäß Ihrem Szenario erklären.

Nach meiner Methode müssen wir die Klassen 'Path' und 'Assembly' verwenden, um den relativen Pfad zu erhalten.

Importieren Sie also zuerst System.IO und System.Reflection, indem Sie Anweisungen verwenden.

Geben Sie dann die unten angegebene Codezeile ein.

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

Tatsächlich speichert die oben angegebene Zeile den Pfad des Ausgabeverzeichnisses Ihres Projekts (hier bezieht sich das Ausgabeverzeichnis auf den Debug- Ordner Ihres Projekts).

Kopieren Sie nun Ihr FolderIcon-Verzeichnis in den Debug-Ordner. Geben Sie dann die unten angegebene Zeile ein.

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

Jetzt enthält diese 'iconPath'-Variable den gesamten Pfad Ihres Folder.ico. Sie müssen es lediglich in einer Zeichenfolgenvariablen speichern. Verwenden Sie dazu die folgende Codezeile.

string icon_path = new Uri(iconPath ).LocalPath;

Jetzt können Sie diese Zeichenfolgenvariable icon_path als relativen Pfad zum Symbol verwenden.

Vielen Dank.

GeorgeT
quelle
1
Warum ist file:vor dem Weg
Kolob Canyon
2
@KolobCanyon Es ist , weil können .NET - Assemblies aus einer Vielzahl von URIs ausgeführt werden und nicht nur von der Festplatte (COM - Objekte, RPC, Etc ...) Sie können , Assembly.GetExecutingAssembly().Locationwenn Sie sicher mit einer Datei (EXE / DLL) , die sich Ihnen
Tomer W
3

Ich denke, dies zu verwenden wird am einfachsten sein

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

oder dieser Code funktioniert auf jedem Computer, auf dem sich Ihr Ordner in Ihrem Stammprojekt befindet, wenn Sie ihn ändern möchten. Ändern Sie einfach diesen Abschnitt @ ".. \"

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

Klicken Sie in Visual Studio im Projektmappen-Explorer auf die Datei "Folder.ico". Dann sehen Sie den Eigenschaftenbereich. Ändern Sie das Verhalten "In Ausgabeverzeichnis kopieren" in "Bei neuerer Version kopieren". Dadurch kopiert Visual Studio die Datei in das Ausgabefachverzeichnis.

Um den Dateipfad über den relativen Pfad abzurufen, geben Sie einfach Folgendes ein:

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

Hoffe das hat geholfen.

Marcin
quelle