Nedávno jsem portoval z .NET do .NET Compact Framework unit testy pro dávkový přenos souborů pomocí SFTP. Mé občasné návraty k .NET CF jsou prakticky vždycky doprovázeny silným hudráním. Chápu docela dobře že na kapesních zařízeních je málo místa a že na silně minimalistický OS plný framework nikdo nedostane. I tak si ale často vzpomenu na lidi, kteří tvrdí, že .NET CF 1 je jen velký wrapper kolem PlatformNotSupportedException :-) .
Tentokrát mi důvod k důkladnému zahudrání poskytly relativní cesty k souborům. Unit testy běžely proti několika konfiguracím a pro svůj běh potřebovaly i pár testovacích souborů. Na desktopovém frameworku žádný problém. Soubory se načítají z aktuálního adresáře neboli z adresáře ve kterém je umístěna assembly s testy.
Naneštěstí PocketPC ani .NET CF 1 žádnou koncepci "aktuálního adresáře" neznají. Pokud uvedete název souboru bez cesty tak se ve většině případů metoda pokusí hledat soubor v kořenovém adresáři souborového systému.
Chcete-li zjistit adresář, ze kterého je spuštěna aplikace (což se dá považovat za docela použitelnou náhradu aktuálního adresáře) použijte následující kód:
using System.IO;
using System.Reflection;
...
string currentDirectory = Path.GetDirectoryName(Assembly.GetExecutingAssembly().GetName().CodeBase);
XmlDocument xml = new XmlDocument();
xml.Load(Path.Combine(currentDirectory,"test_file.xml"));