Entwickler-Ecke

Basistechnologien - Kopieren von Dateien auf USB Device


c#ler - Do 18.08.11 16:39
Titel: Kopieren von Dateien auf USB Device
Hi,
Ich schreibe an einer Applikation, die eine Datei vom Windows-Host System auf ein USB Device kopiert.
Hierzu nutze ich die RAPI Klassenbibliothek.
ist ja quasi nicht mehr als

C#-Quelltext
1:
2:
3:
Communication.RAPI ra = new Communication.RAPI();
ra.Connect();
ra.CopyFileToDevice(@"C:\LogInst.cab"@"\SD Card\LogInst.cab"true);


Ich habe jetzt das Problem, dass sich mein Windowsfenster "aufhängt"/nicht mehr reagiert bis die Datei zuende geschrieben ist.
Das schreiben dauert aber ca. 10 minuten.
Nun möchte ich verhindern, dass das das meine Setup form auf dem PC sich aufhängt oder wenigstens, dass meine Progressbar den Aktuellen fortschritt anzeigt bzw.
Habt ihr ideen?


Th69 - Do 18.08.11 17:07

Dann benutze dafür am besten den BackgroundWorker, d.h. lagere die Methode in die DoWork-Eventmethode aus.
Die ProgressBar kannst du dann wohl nur im Marquee-Modus anzeigen, da du ja keinen Einfluß auf die Kopiermethode hast (d.h. auch die Dauer nicht abschätzen kannst).


c#ler - Fr 19.08.11 14:04

user profile iconTh69 hat folgendes geschrieben Zum zitierten Posting springen:
Dann benutze dafür am besten den BackgroundWorker, d.h. lagere die Methode in die DoWork-Eventmethode aus.
Die ProgressBar kannst du dann wohl nur im Marquee-Modus anzeigen, da du ja keinen Einfluß auf die Kopiermethode hast (d.h. auch die Dauer nicht abschätzen kannst).


Vielen Dank, hat super geklappt :)
Sowohl die Progressbar funktioniert jetzt wunschgemäß, als auch der BackgroundWorker.

Moderiert von user profile iconTh69: Status auf "Frage beantwortet" gesetzt.


c#ler - Mi 24.08.11 13:09

So, ich kriege die CAB jetzt soweit auf das Gerät kopiert. Problem ist, dass ich Sie jetzt gleich ausführen möchte ohne das Gerät in die Hand zu nehmen.
Ich denke das geht über die CreateProcess Funktion der Remote API.

C#-Quelltext
1:
2:
3:
4:
using Communication = OpenNETCF.Desktop.Communication;

Communication.RAPI ra = new Communication.RAPI();
ra.CreateProcess("Lgc.CAB""start");

Das Problem an der Sache:

throw new RAPIException("Error " + errnum.ToString("x") + ": Cannot Create Process" );
Es wird mir lediglich eine Exception geworfen, die sagt: Error C1: Cannot Create Process
Keine weiteren sinnvollen hinweise, was schief gelaufen ist.

Hat jemand eine Idee?

Mein Ansatz ist, dass der Commandlinestring bei

C#-Quelltext
1:
ra.createProcess("Lgc.CAB"//Commandline);                    


so nicht geht. War auch eher auf gutglück.
Please help.


c#ler - Mi 24.08.11 13:56

hab mal testweise

C#-Quelltext
1:
ra.CreateProcess(@"\SD Card\Navigator.exe");                    
eingegeben und dann startet er auch meine Navi software...
Funktioniert CreateProcess evtl. mit Cabs nicht?


Horschdware - Mi 24.08.11 14:04

Hallo,
soweit ich weiss, sind CAB-Dateien einfache Archive und keine ausführbaren Programme. Kann es sein, dass du vorhast, die Datei mit einem geeigneten Entpacker zu öffnen?


c#ler - Mi 24.08.11 14:06

user profile iconc#ler hat folgendes geschrieben Zum zitierten Posting springen:
hab mal testweise

C#-Quelltext
1:
ra.CreateProcess(@"\SD Card\Navigator.exe");                    
eingegeben und dann startet er auch meine Navi software...
Funktioniert CreateProcess evtl. mit Cabs nicht?


Habs:

C#-Quelltext
1:
ra.CreateProcess("wceload""/noaskdesk/noui Lgc.cab");                    

nur iwie funktioniert es noch nicht silent^^

Moderiert von user profile iconTh69: C#-Tags hinzugefügt


Kha - Mi 24.08.11 16:02

Sollte da nicht noch ein Leerzeichen zwischen die Argumente?


c#ler - Fr 26.08.11 10:47

user profile iconKha hat folgendes geschrieben Zum zitierten Posting springen:
Sollte da nicht noch ein Leerzeichen zwischen die Argumente?


Wie meinst du das? zwischen jeden Part?
quasi / xx/ xx?
Sorry falls ich mich da grad doof anstelle^^


Horschdware - Fr 26.08.11 10:49


C#-Quelltext
1:
ra.CreateProcess("wceload""/noaskdesk /noui Lgc.cab");                    



Hier müssten Leerzeichen stehen, da die Einzelparamter sonst nicht erkannt werden


c#ler - Do 15.09.11 16:33

user profile iconHorschdware hat folgendes geschrieben Zum zitierten Posting springen:

C#-Quelltext
1:
ra.CreateProcess("wceload""/noaskdesk /noui Lgc.cab");                    



Hier müssten Leerzeichen stehen, da die Einzelparamter sonst nicht erkannt werden


ich habe es genau so gemacht. Nun wird auf dem Gerät eine Meldung geworfen:

please specify a .cab file or double tap a .cab
file to install the application.

ich habe es mit SD Card als verzeichnis versucht.

C#-Quelltext
1:
ra.CreateProcess("wceload""/noaskdesk /sd card /noui Lgc.cab");                    


Jemand ne idee?


Kha - Do 15.09.11 22:12

Was hast du denn mit dem Pfad angestellt :gruebel: . So vielleicht?

C#-Quelltext
1:
ra.CreateProcess("wceload"@"/noaskdesk /noui ""\SD Card\Lgc.cab""");                    


c#ler - Fr 16.09.11 13:49

user profile iconKha hat folgendes geschrieben Zum zitierten Posting springen:
Was hast du denn mit dem Pfad angestellt :gruebel: . So vielleicht?

C#-Quelltext
1:
ra.CreateProcess("wceload"@"/noaskdesk /noui ""\SD Card\Lgc.cab""");                    


leider kommt, sobald der kopiervorgang abgeschlossen ist weiterhin

"please specify a .cab file or double tap a .cab
file to install the application. "


c#ler - Mo 19.09.11 13:11

user profile iconc#ler hat folgendes geschrieben Zum zitierten Posting springen:
user profile iconKha hat folgendes geschrieben Zum zitierten Posting springen:
Was hast du denn mit dem Pfad angestellt :gruebel: . So vielleicht?

C#-Quelltext
1:
ra.CreateProcess("wceload"@"/noaskdesk /noui ""\SD Card\Lgc.cab""");                    


leider kommt, sobald der kopiervorgang abgeschlossen ist weiterhin

"please specify a .cab file or double tap a .cab
file to install the application. "


Hat jemand vielleicht mit einem Problem dieser Art schonmal zutun gehabt?
Ich teste, versuche und bastel, aber dabei kommt wenig produktives raus und ich will endlich in meinem Projekt weiterkommen.
please help


Horschdware - Mo 19.09.11 13:28

Nunja, das WCE Tool findet wohl deine Datei nicht. Hast du es schon mal mit absoluten Pfaden versucht?
Was passiert, wenn du das Tool über die Kommandozeile mit deinen im Programm beschriebenen Parametern aufrufst?


c#ler - Mo 19.09.11 13:52

user profile iconHorschdware hat folgendes geschrieben Zum zitierten Posting springen:
Nunja, das WCE Tool findet wohl deine Datei nicht. Hast du es schon mal mit absoluten Pfaden versucht?
Was passiert, wenn du das Tool über die Kommandozeile mit deinen im Programm beschriebenen Parametern aufrufst?


Gute Antwort/Gegenfrage.
Ich werde mal schauen, hab das manuell noch garnicht versucht.


c#ler - Di 20.09.11 16:25

user profile iconc#ler hat folgendes geschrieben Zum zitierten Posting springen:
user profile iconHorschdware hat folgendes geschrieben Zum zitierten Posting springen:
Nunja, das WCE Tool findet wohl deine Datei nicht. Hast du es schon mal mit absoluten Pfaden versucht?
Was passiert, wenn du das Tool über die Kommandozeile mit deinen im Programm beschriebenen Parametern aufrufst?


Gute Antwort/Gegenfrage.
Ich werde mal schauen, hab das manuell noch garnicht versucht.


Also:
Ich habe es versucht und es klappt (nur in der Console bis jetzt)

C#-Quelltext
1:
wceload /silent "\Temp\LGC.CAB"                    

so funktioniert es in der Console, wie bring ich das jetzt in meinen Code?


Horschdware - Di 20.09.11 17:34

Moment!
Angenommen deine Datei liegt in "D:\Temp\LGC.CAB", dann funktioniert dein Beispiel mit der Konsole NUR DANN, wenn du dich gerade im Verzeichnis "D:\" befindest, da du wieder eine relative Pfadangabe verwendet hast.

Wie du das in Code umsetzt hatten wir doch schon :gruebel:
Zitat:


C#-Quelltext
1:
ra.CreateProcess("wceload"@"/noaskdesk /noui ""\SD Card\Lgc.cab""");                    


Ersetze nun in dem Aufruf den Pfad durch den richtigen Pfad. Der Aufruf in dem Zitat geht ja davon aus, dass sich die cab-Datei in einem Unterverzeichnis des Ausführungsverzeichnisses befindet - und das muss nicht zwangsläufig das Verzeichnis sein, in dem das Programm selbst abgelegt ist. Dein Experiment auf der Kommandozeile ist da ein gutes Beispiel dafür: Wärest du im Verzeichnis "C:\Windows\" und würdest dein Kommando absetzen, dann würde das WCE Tool ja in "C:\Windows\Temp\" nach deiner Datei suchen - wo sie sich ja nicht befindet.

Nutze einen absoluten Pfad und es sollte gehen.


c#ler - Mi 21.09.11 09:24

user profile iconHorschdware hat folgendes geschrieben Zum zitierten Posting springen:
Moment!
Angenommen deine Datei liegt in "D:\Temp\LGC.CAB", dann funktioniert dein Beispiel mit der Konsole NUR DANN, wenn du dich gerade im Verzeichnis "D:\" befindest, da du wieder eine relative Pfadangabe verwendet hast.

Wie du das in Code umsetzt hatten wir doch schon :gruebel:
Zitat:


C#-Quelltext
1:
ra.CreateProcess("wceload"@"/noaskdesk /noui ""\SD Card\Lgc.cab""");                    


Ersetze nun in dem Aufruf den Pfad durch den richtigen Pfad. Der Aufruf in dem Zitat geht ja davon aus, dass sich die cab-Datei in einem Unterverzeichnis des Ausführungsverzeichnisses befindet - und das muss nicht zwangsläufig das Verzeichnis sein, in dem das Programm selbst abgelegt ist. Dein Experiment auf der Kommandozeile ist da ein gutes Beispiel dafür: Wärest du im Verzeichnis "C:\Windows\" und würdest dein Kommando absetzen, dann würde das WCE Tool ja in "C:\Windows\Temp\" nach deiner Datei suchen - wo sie sich ja nicht befindet.

Nutze einen absoluten Pfad und es sollte gehen.


critical Fail,
ich hab einmal "/" statt "\" verwendet...okay, vielen Dank..es funktioniert jetzt natürlich, nur muss ich die reihenfolge ändern, da keine befehle mehr nach noaskdesk angenommen werden, dementsprechend muss das noui vorher erfolgen.

Vielen Dank :)


c#ler - Mi 21.09.11 10:47

So, jetzt funktioniert es.
Silent und ohne Probleme.
Vielen Dank