¿Cómo obtener la ruta relativa de un archivo en Visual Studio?

82

Estoy tratando de obtener la ruta de un archivo de imagen que agregué en el explorador de soluciones en Visual Studio, pero no pude obtener la ruta relativa de esa imagen. H es la estructura de archivos de mi proyecto:

/ BulutDepoProject
    / FolderIcon
        Folder.ico
        Main.cs

Puedo obtener la imagen como esta:

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

Pero debería poder conseguirlo con algo como:

"~\\FolderIcon\\Folder.ico"

Supongo que no conozco la sintaxis exacta, así que no puedo recuperar la imagen. :(

Tolga Evcimen
fuente

Respuestas:

54

Cuando se da el caso de que quieras usar cualquier tipo de archivo externo, ciertamente hay una manera de ponerlos en una carpeta dentro de tu proyecto, pero no tan válida como obtenerlos de los recursos. En un proyecto de Visual Studio normal, debe tener un Resources.resxarchivo debajo de la Propertiessección; de lo contrario, puede agregar fácilmente su propio Resource.resxarchivo. Y agregue cualquier tipo de archivo en él, puede acceder al tutorial para agregar archivos de recursos a su proyecto aquí .

Después de tener archivos de recursos en su proyecto, llamarlos es tan fácil como esto:

var myIcon = Resources.MyIconFile;

Por supuesto, debe agregar la using Propertiesdeclaración como esta:

using <namespace>.Properties;
Tolga Evcimen
fuente
4
@ christo8989 El OP se trata de un archivo de imagen , que será de readonlytodos modos, así que ....
Jesse Chisholm
37

Llego un poco tarde y no estoy seguro de si esto es lo que estás buscando, pero pensé en agregarlo en caso de que alguien más lo encuentre útil.

Suponga que esta es su estructura de archivos:

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

Necesita escribir su ruta relativa al Main.exearchivo. Entonces, desea acceder Folder.ico, en su Main.cspuede usar:

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

¡Eso pareció funcionar para mí!

AdamInTheOculus
fuente
1
Esta es una mejor solución en mi caso, ya que el archivo al que se hace referencia es administrado por otro proyecto en la Solución. ¿No admite la sintaxis un solo punto? string path = ".\\FileName.txt"
Christopher J. Grace
1
Esta es una solución terrible, no la use ... esto solo funciona porque en el escenario "Debug", su directorio de trabajo actual es, <Project>/Debug por lo tanto, funciona para el entorno VS Debug. Pero si sale del IDE ... o ejecuta el EXE desde un directorio de trabajo diferente, seguramente se romperá.
Tomer W
25

Omita el "~ \":

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

~\no significa nada en términos del sistema de archivos. El único lugar que he visto que se usa correctamente es en una aplicación web, donde ASP.NET reemplaza la tilde con la ruta absoluta a la raíz de la aplicación.

Por lo general, puede asumir que las rutas son relativas a la carpeta donde se encuentra el EXE. Además, asegúrese de que la imagen se especifique como "contenido" y "copiar si es más reciente" / "copiar siempre" en la pestaña de propiedades en Visual Studio.

3Dave
fuente
En unix / linux, '~' es sinónimo de "directorio de inicio".
Nyerguds
1
@Nyerguds sí. Sin embargo, la barra inclinada es incorrecta, y esta pregunta está etiquetada como "Visual Studio", que no es realmente compatible con Linux, especialmente en 2012 cuando se publicó esta pregunta.
3Dave
"Por lo general, puede asumir que las rutas son relativas a la carpeta donde se encuentra el EXE" << ¡Muy falso! cuando hace doble clic en un EXE en Windows, el directorio de trabajo es la ubicación privada del usuario y NO la ubicación ejecutable.
Tomer W
@TomerW Hay muchas formas de ejecutar un ejecutable además de hacer doble clic en él.
3Dave el
Correcto, sin embargo ... una aplicación debería funcionar en todos los sentidos, incluido Dblclick, que es el más común, creo.
Tomer W
17

También encontré el mismo problema y pude resolverlo. Déjame explicarte los pasos que apliqué. Lo explicaré de acuerdo con su escenario.

De acuerdo con mi método, necesitamos usar la clase 'Ruta' y la clase 'Ensamblador' para obtener la ruta relativa.

Entonces, primero importe System.IO y System.Reflection en el uso de declaraciones.

Luego escriba la línea de código dada a continuación.

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

En realidad, la línea anterior almacena la ruta del directorio de salida de su proyecto (aquí, el directorio de 'salida' se refiere a la carpeta Debug de su proyecto).

Ahora copie su directorio FolderIcon en la carpeta Debug. Luego escriba la línea dada a continuación.

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

Ahora, esta variable 'iconPath' contiene la ruta completa de su Folder.ico. Todo lo que tiene que hacer es almacenarlo en una variable de cadena. Use la línea de código a continuación para eso.

string icon_path = new Uri(iconPath ).LocalPath;

Ahora puede utilizar esta variable de cadena icon_path como su ruta relativa al icono.

Gracias.

GeorgeT
fuente
1
¿Por qué está file:frente al camino?
Cañón de Kolob
2
@KolobCanyon Es porque .NET Assemblies se puede ejecutar desde una variedad de URI y no solo desde el disco (objetos COM, RPC, etc.) que puede usar Assembly.GetExecutingAssembly().Locationsi está seguro de que está tratando con un archivo (EXE / DLL)
Tomer W
3

Creo que usar esto será lo más fácil

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

o este código funcionará en cualquier máquina que si su carpeta está en su proyecto raíz si desea cambiarla ... simplemente cambie esta sección @ ".. \"

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

En Visual Studio, haga clic en el archivo 'Folder.ico' en el panel del Explorador de soluciones. Luego verá el panel Propiedades. Cambie el comportamiento de 'Copiar al directorio de salida' a 'Copiar si es más reciente'. Esto hará que Visual Studio copie el archivo en el directorio de la bandeja de salida.

Ahora, para obtener la ruta del archivo usando la ruta relativa, simplemente escriba:

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

Espero que haya ayudado.

Marcin
fuente