C# zoeken naar een specifieke .exe op de schijf

Status
Niet open voor verdere reacties.

Kees987

Gebruiker
Lid geworden
24 dec 2011
Berichten
12
hoi,
sinds kort ben ik de eerste stappen aan het nemen in c# programmeren, en het 1e kleine bestandje heb ik al voor elkaar gekregen.
nu ben ik echter aan een nieuwe bezig maar loop ik tegen wat problemen aan.
via google kwam ik dan ook op dit forum uit, dus hopelijk is er iemand die me hier verder kan helpen.

Wat wil ik dat de app doet:
vij simpel, een .exe bestand laten opstarten met wat extra parameters.

Wat is het probleem:
op het systeem is applicatie A geïnstalleerd.
degene welke ik nu probeer te schrijven noem ik even applicatie B.

Applicatie A is in 90% van de gevallen op de standaard plek geïnstalleerd, dus zal in in App B een aantal voorkeurpaden meegeven waar hij eerst zal moeten kijken.
echter, het kan voorkomen dat de gebruiker applicatie A niet op de standaard plaats heeft staan, maar iets anders heeft gekozen. In dat geval wil ik dus dat applicatie B gaat scannen op de schijven waar dan de applicatie geïnstalleerd is.
dit wou ik dan laten doen door naar de specifieke .exe naam te laten zoeken, aangezien deze bekend is.

dus had ik deze regel code gebruikt
Code:
string[] A_dir = Directory.GetFiles("c:\\", "Application_A.exe", SearchOption.AllDirectories);

helaas geeft hij dan een foutmelding terug:
Access denied C:/Documents and Setting.


nu begrijp ik van internet al dat dit onder Win 7 een soort "fake folder" is, en dus ook niet bestaat.
maar ik kwam er niet helemaal uit hoe ik hier dan binnen c# omheen kan komen en dus de error kan oplossen.

is er iemand die weet hoe ik om deze error heen kan?
kan ik een soort van "skip" ofzo toepassen voor deze type error ?

hopelijk kan iemand me helpen
alvast bedankt!
 
Persoonlijk denk ik niet dat dit de beste oplossing is.

Laat applicatie B elke keer bij het opstarten naar het register wegschrijven waar deze zich bevind.
Dit kan applicatie A dan weer uitlezen. :)
 
probleem is dat applicatie A een 3rd party programma is, dus de gebruiker zou deze al op het systeem geïnstalleerd hebben.
applicatie B (degene welke ik probeer te schijven) zal dan een soort handige starter zijn welke de juiste parameter dan gelijk zal meegeven.

de reden hiervoor is namelijk dat applicatie A op dit moment nog werkt met .Bat bestandjes welke een exact pad gebruiken, en zoals je al gokt, dit daardoor vaak niet goed gaat. zeker tussen 64 en 32 bits systemen klopt het dan vaak weer niet ivm the map "program files" en "program files (x86)"

vandaar dat ik dus zoek naar een manier om dus ene mooie starter te maken.
het plan wat ik hierbij had:
stap 1 zal dan zijn dat hij een aantal standaard paden zal kijken via een list en dan via: if (Directory.Exists(De_lijst))
stap 2 zal dan zijn, dat als hij het daar niet vind, dat hij dan zal gaan zoeken waar hij dan wel die juiste map en/of exe kan vinden.
stap 3 zal dan moeten zijn dat hij dit, wanneer eenmaal gevonden, wegschrijft naar ene bestandje welke hij aanmaakt, bijvoorbeeld iets als settings.ini
eigenlijk zou er dan dus ook een stap 0 moeten zijn die dus eerst kijkt of de ini al bestaat en heb dan uitleest.

vandaar dat ik dus tegen het probleem oploop met die c:\Documents and folders
deze lijkt dus niet te bestaan ofzo, maar ik heb (nog) geen idee hoe ik om deze error heen kom.
applicatie A kan ik dus in basis niet mee doen.

enig idee ?:)
 
Er zal ongetwijfeld een nettere oplossing bestaan om het via het register uit te lezen waar de applicatie staat oid. ( het idee van JoZ1 ).
Het enige dat ik je kan aanbieden is een work-around, voorzover dit een workaround is dan. Als de applicatie in documents folder staat, is deze niet met deze workaround te vinden. Als die in een normale folder staat dan find die hem wel.

[cpp]
public static void Main(string[] args)
{
foreach (string dir in Directory.GetDirectories(@"c:/"))
{

try
{
string[] found = Directory.GetFiles(dir,"Application_A.exe",SearchOption.AllDirectories);
if (found != null)
{
foreach (string s in found)
{

Console.WriteLine("found: " + s);
}
}
}
catch (Exception ex)
{
Console.WriteLine("error " + ex.Message);
}
}
Console.WriteLine("end");
}[/cpp]
 
Laatst bewerkt:
Dit kan nog ietsje netter (door je hele computer zoeken duurt wel een tijdje). Deze werkt iteratief.
[cpp]
public string SearchApplication(string application)
{
return SearchApplication(application, "C://");
}
private string SearchApplication(string application, string directory)
{
string[] found = Directory.GetFiles(directory, application, SearchOption.TopDirectoryOnly);

if (found.Length != 0)
return found[0];

foreach (string dir in Directory.GetDirectories(directory))
{
try
{
string f = SearchApplication(application, dir);
if (f != "")
return f;

}
catch { }
}

return "";
}
[/cpp]
 
Het lijkt mij de netste en snelste (en wellicht veiligste) manier om het programma via het register op te sporen.
Daarnaast kan het zijn dat je natuurlijk een 'false positive' krijgt, dat wil zeggen dat er nog een applicatie is met dezelfde "naam.exe" als bestandsnaam. Hoe weet je dan of je de juiste hebt?

Tip: installeer het programma zelf en ga kijken welke register sleutels zijn/worden aangemaakt.
 
Probeer desnoods Applicatie A te updaten o.i.d. Het register is inderdaad het snelst/veiligst.

Als dit echt niet mogelijk is, zul je het met de oplossingen van wicherh en Westerland moeten doen. ;)
 
is er ergens een mooie tutorial hoe je iets uit het register kan halen ?
zoals gezegd, ik ben nog niet zo bekend met c#. boek dat ik heb besteld moet helaas ook nog binnen komen 1 deze dagen.
 
bedankt voor alle hulp!
helaas heeft Bol bij de feestdagen wat vertraging opgelopen dus is het zelf studie boek voor C# nog steeds niet binnen :(

tot nu toe lukt het om het register uit te lezen, en hier een string uit te destileren waarin het juiste pad staat.
echter, nu loop ik nog tegen een klein probleem aan waar ik het antwoord nog niet op kan vinden.

het pad ziet er nu standaard zo uit wat hij van de externe applicatie weer te halen via register: "C:\Program Files (x86)\Viewer\Viewer.exe" "%1"
wanneer ik dit nu via application.start laat starten, werkt dit niet omdat het uit 2 delen bestaan tussen de ""

vraag is eigenlijk (wat ik via google nog niet had gevonden), hoe ik nu die delen tussen de "" destileer naar losse strings.
 
Zoiets:

[cpp]string Input = "C:\\Program Files (x86)\\Viewer\\Viewer.exe \"%1\"";
System.Diagnostics.Process.Start(Input.Split('\"')[0], Input.Split('\"')[1]);[/cpp]
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan