Weblog @ rebex.cz

Weblogy na webu Rebexu
Welcome to Weblog @ rebex.cz Sign in | Help
in Search

Weblog @ Rebex.cz :: Martin Vobr

weblog o vývoji v dotnetu

.NET CF a relativní cesta k souboru (a jak se bez ní obejít)

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"));

Published 22. ledna 2009 9:00 by martinv

Comments

 

Vitezslav Gazda said:

Taky jsem nedavno delal podobny "port". Pozor na to, ze to neni cesta aplikace, ale cesta assembly ve ktere je ten kod, coz muze byt problem v pripade umisteni kodu do samostatne assembly. A pokud budete chtit opravdu cestu ke spustene aplikaci, tak narazite na to, ze GetEntryAssembly opet chybi a nezbyva nez pouzit API GetModuleFileName:

[DllImport("CoreDLL",SetLastError = true)]

private static extern int GetModuleFileName(IntPtr module,StringBuilder result,int length);

StringBuilder file = new StringBuilder(260);

GetModuleFileName(IntPtr.Zero,file,file.Capacity);

entryAssembly = Assembly.LoadFrom(file.ToString());

ledna 22, 2009 15:19
 

martinv said:

Dik za upresneni.

ledna 22, 2009 19:51
 

Petr Slezák said:

Dobrý den a díky za nakopnutí i pro mne

sle co ta druhá funkce GetModuleFileName

Začínám s VB.NET a není mi jasná ...

co je to [DllImport("CoreDLL",SetLastError = true)]

A jaké parametry předám do funkce GetModuleFileName

Nešel by příklad ve VA.NET jak získat

Aplication Path s funkcí GetModuleFileName

Díky

února 2, 2009 10:05
New Comments to this post are disabled

This Blog

Syndication

News

Chcete koupit ojeté auto a chcete ho nechat prohlédnout někým kdo tomu rozumí a komu můžete věřit? Zkuste mého kamaráda Michala Ráže - Poradce při koupi ojetého vozu

ComponentForge (aka Safabyte) sells components stolen from Rebex and other .NET component vendors.

Uz jste vyzkoušeli naší komponentu pro práci s formátem ZIP s hromadou ukázek v jazycích C# a VB.NET?

Inspirace na výlet: Stubaiské Alpy - jak je zažili Honza a Mišák.

Powered by Community Server (Personal Edition), by Telligent Systems