El siguiente método busca un archivo comenzando desde la ruta de inicio de la aplicación (carpeta *.exe). Si el archivo no se encuentra allí, se buscan las carpetas padre hasta que se encuentre el archivo o se llegue a la carpeta raíz. Se devuelve null
si el archivo no se encuentra.
public static FileInfo FindApplicationFile(string fileName)
{
string startPath = Path.Combine(Application.StartupPath, fileName);
FileInfo file = new FileInfo(startPath);
while (!file.Exists) {
if (file.Directory.Parent == null) {
return null;
}
DirectoryInfo parentDir = file.Directory.Parent;
file = new FileInfo(Path.Combine(parentDir.FullName, file.Name));
}
return file;
}
Nota: Application.StartupPath
se utiliza generalmente en aplicaciones WinForms, pero también funciona en aplicaciones de consola; sin embargo, deberás establecer una referencia al ensamblado System.Windows.Forms
. Puedes reemplazar Application.StartupPath
por
Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location)
si lo prefieres.
Utilizo esta estrategia para encontrar archivos de configuración y recursos. Esto me permite compartirlos para múltiples aplicaciones o para versiones de depuración y de producción de una aplicación colocándolos en una carpeta padre común.