Avatar billede krak Nybegynder
12. august 2004 - 14:03 Der er 44 kommentarer og
1 løsning

IOException: CreateProcess

Hej

Jeg har følgende linie:
Runtime.getRuntime().exec("kommando");

- der kalder pdftk.exe fra http://www.accesspdf.com/pdftk/
(Den henter en pdf-fil, dekrypterer den, og gemmer den i nyt navn)

Der opstår følgende fejl:   

java.io.IOException: CreateProcess: <kommando> error=2
    at java.lang.Win32Process.create(Native Method)
    at java.lang.Win32Process.<init>(Unknown Source)
    at java.lang.Runtime.execInternal(Native Method)
    at java.lang.Runtime.exec(Unknown Source)

Om fejlen skyldes pdftk-programmet eller adgangen til pdf-filen der behandles i kommandoen, ved jeg ikke.

Nogen, der har en ide til en løsning?
Avatar billede arne_v Ekspert
12. august 2004 - 14:05 #1
Den slags problemer plejer at betyde problemer med at finde kommandoen.

Hvad bruger du helt præcist for kommando ?
Avatar billede fsconsult.dk Nybegynder
12. august 2004 - 14:06 #2
hvis det er en intern windoze kommando eller shellscript, skal du normalt kalde CMD.EXE til at afvikle "kommando" med.
Avatar billede arne_v Ekspert
12. august 2004 - 14:06 #3
På Windows kan skal man sommetider bruge:

"cmd /c den-rigtige-kommando"
Avatar billede arne_v Ekspert
12. august 2004 - 14:10 #4
Andre gange skal man splitte kommando og argumenter op:

String[] cmd = { "kommando", "arg1", "arg2" };
Runtime.getRuntime().exec(cmd);

men det plejer at være på Unix/Linux at det driller.
Avatar billede krak Nybegynder
12. august 2004 - 14:13 #5
Kommandoen er:
Runtime.getRuntime().exec("pdftk "+currentFileAbsolutePath+"  output "+currentUncryptedFileAbsolutePath);

Svarende til standarden:
pdftk secured.pdf input_pw foopass output unsecured.pdf   

PDF-filerne har dog intet kodeord, hvormed jeg kun har indsat de 3 mellemrum før "output".

Selve kommandoen fungerer fint, når den kaldes fra en bat-fil.
Avatar billede arne_v Ekspert
12. august 2004 - 14:15 #6
Er pdftk.exe i PATH ?
Avatar billede arne_v Ekspert
12. august 2004 - 14:17 #7
Hvis pdftk ikke ern exe men en bat kan du prøve:

Runtime.getRuntime().exec("cmd /c pdftk "+currentFileAbsolutePath+"  output "+currentUncryptedFileAbsolutePath);

Ellers prøv:

String[] cmd = { "pdftk", currentFileAbsolutePath, "output", currentUncryptedFileAbsolutePath };
Runtime.getRuntime().exec(cmd);
Avatar billede krak Nybegynder
12. august 2004 - 14:21 #8
pdftk.exe var ikke i classpath, men det er den nu. Dog ingen ændring.
- og det ER en exe-fil (som ligger i samme dir som class-filerne)
Avatar billede fsconsult.dk Nybegynder
12. august 2004 - 14:21 #9
iøvrigt bør du nok angive de manglende parametre (passwords) med "" istedet for ekstra blank, da flere sammenhængende blanke normalt bliver opfattet som en, og ikke et tom parameter. (dvs. at din output bliver opfattet som password istedet)
Avatar billede arne_v Ekspert
12. august 2004 - 14:26 #10
PATH ikke CLASSPATH

men current dir er så vidt jeg ved automatisk i PATH i Windows
Avatar billede arne_v Ekspert
12. august 2004 - 14:28 #11
fs>

Jeg opfattede input_pw og output som keywords der sikrede ikke positions bestemte
argumenter.
Avatar billede krak Nybegynder
12. august 2004 - 14:35 #12
Har netop prøvet følgende, men stadig samme besked.

String[] cmd = { "pdftk", currentFileAbsolutePath, "", "", "output "+currentUncryptedFileAbsolutePath};
Runtime.getRuntime().exec(cmd);

Og ja: Output skal stå sammen med filnavnet
[output <output filename>]
Avatar billede arne_v Ekspert
12. august 2004 - 14:40 #13
Suk.

Har du prøvet ar hente error streamen fra det Process objekt som exec returnerer og
læse fra det og sem der står "noget" ?
Avatar billede fsconsult.dk Nybegynder
12. august 2004 - 14:42 #14
arne> my mistake ;-)

Er lidt blank over for hvad problemet så kan være. Får du kun "<kommando> error=2
" som fejl?  Kan være at error=2 betyder cmd returncode 2 (hvad det så end er... file not found måske).
Avatar billede arne_v Ekspert
12. august 2004 - 14:42 #15
Process p = Runtime.getRuntime().exec("...");
      BufferedReader br = new BufferedReader(new InputStreamReader(p.getErrorStream()));
      String line;
      while((line = br.readLine()) != null) {
        System.out.println(line);
      }
Avatar billede arne_v Ekspert
12. august 2004 - 14:42 #16
Eller måske:

Process p = Runtime.getRuntime().exec("...");
      BufferedReader br = new BufferedReader(new InputStreamReader(p.getInputStream()));
      String line;
      while((line = br.readLine()) != null) {
        System.out.println(line);
      }
Avatar billede krak Nybegynder
12. august 2004 - 14:51 #17
Well... For det første opstår exception i den linie Process p bliver oprettet.

Efter at have smidt det ind i en try-catch, opstår der yderligere en NullPointerException fordi p ikke er blevet oprettet (egentlig logisk nok)

Som fejlbeskeden også siger er den jo gal med oprettelsen, men... piv!
Avatar billede krak Nybegynder
12. august 2004 - 14:52 #18
altså NullPointerException i den linie, hvor vi forsøger at hente ErrorStream
Avatar billede arne_v Ekspert
12. august 2004 - 14:53 #19
Sorry - det burde jeg have tænkt på.
Avatar billede krak Nybegynder
12. august 2004 - 14:55 #20
helt ok. Men hvad kan der gøres?
Avatar billede arne_v Ekspert
12. august 2004 - 15:09 #21
Godt spørgsmål.

Prøv med:

en bat fil med hardccoded filnavne

exec "cmd /c batfil"

og se om det virker.
Avatar billede arne_v Ekspert
12. august 2004 - 15:09 #22
Hvis det gør det så bygger vi videre på det.
Avatar billede krak Nybegynder
12. august 2004 - 15:14 #23
At hardcode alle filnavne vil ikke være optimalt, da kommandoen ligger i en løkke med 10-40 gennemløb.

Hvert gennemløb behandler en selvstændig fil, da hver fil skal dekrypteres før de alle til sidst kan merges i een PDF-fil.
Avatar billede krak Nybegynder
12. august 2004 - 15:15 #24
- hver fil indeholder een side af dokumentet, som typisk har mellem 10 og 40 sider, men sagtens kan være større.
Avatar billede arne_v Ekspert
12. august 2004 - 15:16 #25
Jeg er udmærket klar over at det ikke er en løsning.

Men hvis det virker så vil vi forsøge at sætte argumenter på kaldet af den bat fil.
Avatar billede arne_v Ekspert
12. august 2004 - 15:17 #26
Jge kan ikke lige se hvorfor det skulel hjælpe.

Men hvad er alternativet ? Dunke hovedet ind i en mur 10 gange ?
Avatar billede krak Nybegynder
12. august 2004 - 15:20 #27
Når jeg afprøver kommandoen i en helt selvstændig klasse fungerer det fint. Her kaldes den med:
Runtime.getRuntime().exec("pdftk encryptedPDF.pdf    output unsecured2.pdf");
- Og det fungerer også selvom filen encryptedPDF.pdf er i brug.

Kan det have noget at sige, at det bliver brugt i en JApplet?
Avatar billede arne_v Ekspert
12. august 2004 - 15:22 #28
Ja for pokker.

Applets bør absolut ikke have lov til at køre EXE filer.
Avatar billede krak Nybegynder
12. august 2004 - 15:23 #29
heller ikke selvom appletten har fuld adgang til det ene og det andet?
Avatar billede arne_v Ekspert
12. august 2004 - 15:25 #30
Hvis du har signet appletten og givet den alle priviligier, så burde det kunne
lade sig gøre.
Avatar billede arne_v Ekspert
12. august 2004 - 15:25 #31
Hvilken JVM kører din browser med ?
Avatar billede krak Nybegynder
12. august 2004 - 15:27 #32
appletten er signet og har fået doAsPrivileged og AllPermission
Avatar billede krak Nybegynder
12. august 2004 - 15:28 #33
+ filePermission og PropertyPermission
= Hele fejemøget
Avatar billede krak Nybegynder
12. august 2004 - 15:29 #34
JVM 1.4.2_04
Avatar billede arne_v Ekspert
12. august 2004 - 15:29 #35
Men hvor ligger EXE filen henne ?

Den vil jo ikke downloade den automatisk.

Den skal derfor ligge på client PC'en.

Og da det vel er lidt uklart hvad current directory er for en applet ville
jeg også angive fuld sti til EXE filen !
Avatar billede arne_v Ekspert
12. august 2004 - 15:30 #36
Runtime.getRuntime().exec("C:\\myniftytools\\bin\\pdftk "+currentFileAbsolutePath+"  output "+currentUncryptedFileAbsolutePath);
Avatar billede arne_v Ekspert
12. august 2004 - 15:31 #37
1.4.2_04 fåes ikke nyere i prod kvalitet, så den er god nok

(jeg blev lidt bekymret for om det var MS JVM 1.1.4 vi sad og kæmpede med)
Avatar billede krak Nybegynder
12. august 2004 - 15:43 #38
Nu begynder der at ske noget.... I det mindste er den gået igang med at udføre kommandoen (selvom der ikke kommer nogen outputfil)

Så det var angiveligt denne simple sti til exe-filen den var gal med... DOH!
- Gæt hvem der nu står og banker hovedet ind i muren!

Men selvfølgelig skal der opstå et problem i kølvandet på løsningen af et andet...

Klokken nærmer sig 16, og jeg lader det ligge til i morgen!

Jeg takker allerydmygst for din meget ihærdige indsats!!!
Avatar billede arne_v Ekspert
12. august 2004 - 15:48 #39
Hvis den går igang så skal du nok kigge lidt på mine 14:42:20 og 14:42:55
forslag.
Avatar billede arne_v Ekspert
12. august 2004 - 15:49 #40
Og et svar
Avatar billede krak Nybegynder
12. august 2004 - 15:49 #41
Hmm... Processens inputStream er tom...
Avatar billede arne_v Ekspert
12. august 2004 - 15:50 #42
Hvad med errors ?
Avatar billede arne_v Ekspert
12. august 2004 - 15:51 #43
Iøvrigt et hurtigt skud fra hoften: er der fuld sti på PDF filerne også ?
Avatar billede krak Nybegynder
12. august 2004 - 15:57 #44
PDF'erne kaldes med AbsolutePath, så den skulle være god nok!

ErrorStream:
Error: Failed to open PDF file:
  output <sti>\<filnavn>.pdf
Done.  Input errors, so no output created.

Men output-filen er blevet oprettet et par linier før med:
File outPutFile = new File(fileTempPath, "decrypt_p" + intCurrentPage + ".pdf");
- hvor fileTempPath er et foruddefineret dir og intCurrentPage det aktuelle sidetal

Derfor forstår jeg ikke umiddelbart hvorfor outputfilen ikke kan åbnes...
Avatar billede arne_v Ekspert
12. august 2004 - 16:40 #45
Et File objekt opretter vel ikke en fil medmindre man kalder createNewFile metoden ?

Iøvrigt undrer det mig hvis hvis en fil som angives med output skal være opretteti forvejen.

Er der styr på \ versus / ?
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester