AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Multimedia Delphi Probleme mit kurzen und langen Dateinamen / Übergabe
Thema durchsuchen
Ansicht
Themen-Optionen

Probleme mit kurzen und langen Dateinamen / Übergabe

Ein Thema von frieder2008 · begonnen am 21. Mär 2009 · letzter Beitrag vom 21. Mär 2009
Antwort Antwort
Seite 1 von 2  1 2      
frieder2008

Registriert seit: 28. Feb 2009
78 Beiträge
 
#1

Probleme mit kurzen und langen Dateinamen / Übergabe

  Alt 21. Mär 2009, 13:14
Moin Leute,

ich sitze seit einiger Zeit an folgendem Problem:

Ich starte via CreateProcess eine Batch-Datei und übergebe ihr zwei Dateinamen, die ihrerseits wiederum mit dem nachfolgendem Code an ein Perl-Skript weitergegeben werden (etwas um die Ecke, geht aber grade nich anders). Mein Problem ist: Die Batchdatei startet zwar, übergibt die Dateinamen aber offenbar falsch. Warum?!? Habe es schon mit kurzen Dateinamen versucht, mit "" - hat aber alles nix geholfen.

Wenn ich das Batch-File via cmd starte und die Dateinamen in Kurzform ("C:\DOKUME~1\FRIEDE~1\EIGENE~1\Delphi\TAGGED~1\te st.TXT" "C:\DOKUME~1\FRIEDE~1\EIGENE~1\Delphi\TAGGED~1\TAG GED~1.200\tagged_test.TXT") dann klappt es ohne Probleme.

Ich will eigentlich einfach nur die Batchdatei mit zwei Parametern (als lange Windows-Dateinamen inkl. Leerzeichen) übergeben. Kann doch nicht so schwer sein. Dacht ich.

Dankbar für jeden Tipp!
Gruß, frieder


Delphi-Code:

Delphi-Quellcode:

function ExecAndWait(const Filename, Params: string;
                           WindowState: word): boolean;
var
  SUInfo: TStartupInfo;
  ProcInfo: TProcessInformation;
  CmdLine: string;
begin
  //Dateinamen in Anführungszeichen wg. langer Dateinamen mit Blanks
  CmdLine := '"' + Filename + '"' + Params;

  FillChar(SUInfo, SizeOf(SUInfo), #0);
  with SUInfo do
  begin
    cb := SizeOf(SUInfo);
    dwFlags := STARTF_USESHOWWINDOW;
    wShowWindow := WindowState;
  end;

  Result := CreateProcess(nil, PChar(CmdLine), nil, nil, FALSE,
                          CREATE_NEW_CONSOLE or NORMAL_PRIORITY_CLASS, nil,
                          PChar(ExtractFilePath(Filename)), SUInfo, ProcInfo);

  //Warten bis beendet
  if Result then
    WaitForSingleObject(ProcInfo.hProcess, INFINITE);
end;


procedure TForm1.Button6Click(Sender: TObject);
var
par: string;
temp: tstringlist;
i: integer;
begin

  if filelist.Items.count = 0 then exit;

  if checkbox1.checked then
    begin
    createdir(filelist.directory + '\tagged_' + datetostr(date));
    edit2.text:= (filelist.directory + '\tagged_' + datetostr(date));
    end
    else edit2.text:= filelist.directory;

  for i:=0 to filelist.Items.count-1 do
    begin

    par:= '"' + shortfilename(filelist.directory + '\' + filelist.Items.Strings[i]) + '" "' + shortfilename(edit2.text) + '\tagged_' + filelist.items.strings[i] + '"';

    memo3.lines.add(par);

    Execandwait(extractfiledir(edit1.text) + '\CCCGraph.bat', par, sw_shownormal);

    if fileexists(edit2.text + '\tagged_' + filelist.items.strings[i]) then memo3.Lines.add(edit2.text + '\tagged_' + filelist.items.strings[i])
      else messagedlg('Achtung! Ein Fehler ist aufgetreten! Bitte prüfen Sie alle Einstellungen und Arbeitsvorraussetzungen (Ist Perl installiert?)', mterror, [mbok],0);
    end;

  if fileexists(extractfiledir(edit1.text) + '\CCCGraph.bat') then deletefile(extractfiledir(edit1.text) + '\CCCGraph.bat');

end;

Der Batch-Code:

Code:
@echo off
set TAGDIR=C:\DOKUME~1\FRIEDE~1\EIGENE~1\ARBEIT~1\TREETA~1
set BIN=%TAGDIR%\bin
set CMD=%TAGDIR%\cmd
set LIB=%TAGDIR%\lib
set TAGOPT=%LIB%\german.par -token -lemma -sgml -no-unknown

if "%2"=="" goto label1
perl %CMD%\tokenize.pl -a %LIB%\german-abbreviations %1 | %BIN%\tree-tagger %TAGOPT% > %2
goto end

:label1
if "%1"=="" goto label2
perl %CMD%\tokenize.pl -a %LIB%\german-abbreviations %1 | %BIN%\tree-tagger %TAGOPT% 
goto end

:label2
echo.
echo Usage: tag-german file {file}
echo.

:end

EDIT:

Anders gefragt: Warum funktionier DAS nicht (mit obiger Funktion):

Delphi-Quellcode:
  Execandwait('C:\Dokumente und Einstellungen\frieder\Eigene Dateien\Arbeit_GS\TreeTagger\bin\CCCGraph.bat',
  '"C:\DOKUME~1\FRIEDE~1\EIGENE~1\Delphi\TAGGED~1\test.TXT" "C:\DOKUME~1\FRIEDE~1\EIGENE~1\Delphi\TAGGED~1\TAGGED~1.200\tagged_test.TXT"', sw_shownormal)
  Mit Zitat antworten Zitat
Benutzerbild von sx2008
sx2008

Registriert seit: 15. Feb 2008
Ort: Baden-Württemberg
2.332 Beiträge
 
Delphi 2007 Professional
 
#2

Re: Probleme mit kurzen und langen Dateinamen / Übergabe

  Alt 21. Mär 2009, 14:43
*.bat - wird durch den alten MSDOS 5.0 kompatiblen COMMAND.COM interpretiert.
*.cmd - wird durch neue Cmd.exe interpretiert

Ich würde es mal mit einer cmd-Batchdatei versuchen.
  Mit Zitat antworten Zitat
frieder2008

Registriert seit: 28. Feb 2009
78 Beiträge
 
#3

Re: Probleme mit kurzen und langen Dateinamen / Übergabe

  Alt 21. Mär 2009, 14:55
Aber das ändert doch nichts an dem Problem, dass die Übergabe der Datein von Delphi -> Bat nicht funktioniert, oder?!?

danke & gruß, frieder
  Mit Zitat antworten Zitat
Benutzerbild von sx2008
sx2008

Registriert seit: 15. Feb 2008
Ort: Baden-Württemberg
2.332 Beiträge
 
Delphi 2007 Professional
 
#4

Re: Probleme mit kurzen und langen Dateinamen / Übergabe

  Alt 21. Mär 2009, 15:00
Zitat von frieder2008:
Aber das ändert doch nichts an dem Problem, dass die Übergabe der Datein von Delphi -> Bat nicht funktioniert, oder?!?
Einfach ausprobieren!
COMMAND.COM kann mit langen Dateinamen nicht umgehen; Cmd.exe dagegen schon.
Also statt BAT-Dateien einfach mal CMD-Dateien verwenden.

Öffne mal eine Eingabeaufforderung und gehe in ein Verzeichnis, dass lange Datei/Pfadnamen enthält.
Dann starte COMMAND.COM. Du siehst wie sich das Prompt verändert.
Code:
C:\Users\Guest>cd "Saved Games"

C:\Users\Guest\Saved Games>command
Microsoft(R) Windows DOS
(C)Copyright Microsoft Corp 1990-2001.

C:\USERS\GUEST\SAVEDG~1>
  Mit Zitat antworten Zitat
Satty67

Registriert seit: 24. Feb 2007
Ort: Baden
1.566 Beiträge
 
Delphi 2007 Professional
 
#5

Re: Probleme mit kurzen und langen Dateinamen / Übergabe

  Alt 21. Mär 2009, 17:47
Er ruft ja nicht Command.com auf, sondern eine BAT-Datei. Denke es wird dann automatisch CMD zur Behandlung gestartet.

Folgender BAT-Datei funktioniert bei mir mit Übergabe der Textdatei:
Das ist eine Datei mit langem Dateinamen.txt
Code:
@echo off
cls

echo %1
pause

notepad %1
Angezeigt wird "Das ist eine Datei mit langem Dateinamen.txt" und Notepad korrekt gestartet.

btw:
Delphi-Quellcode:
// Params sollte außerhalb wie folgt vorbereitet werden:
Params := '"' + Param1 + '" "' + Param2 + '"';

// in ExecAndWait
Result := CreateProcess(PChar(FileName), PChar(Params),
Bei mir klappts...
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.540 Beiträge
 
Delphi 11 Alexandria
 
#6

Re: Probleme mit kurzen und langen Dateinamen / Übergabe

  Alt 21. Mär 2009, 18:16
Wie wäre es denn, vorher mit MSDN-Library durchsuchenGetShortPathName den kurzen Dateinamen zu ermitteln und den dann zu übergeben?
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
zeras

Registriert seit: 11. Mär 2007
Ort: Saalkreis
1.618 Beiträge
 
Delphi 12 Athens
 
#7

Re: Probleme mit kurzen und langen Dateinamen / Übergabe

  Alt 21. Mär 2009, 19:07
Ich nutze auch "GetShortPathName", um dann Batchfiles zu starten. Klappt einwandfrei. Mit kurzen Dateinamen sollte jedes Programm umgehen können, mit langen nicht immer.
Matthias
  Mit Zitat antworten Zitat
frieder2008

Registriert seit: 28. Feb 2009
78 Beiträge
 
#8

Re: Probleme mit kurzen und langen Dateinamen / Übergabe

  Alt 21. Mär 2009, 19:23
Danke für die Antworten, aber ich bekomms nicht hin:

Folgendes hab ich (u.a.) versucht, sowohl mit als auch ohne getshortpathname; "" als extra Params hat auch nicht gefunzt:

Delphi-Quellcode:
 
function ExecAndWait(const Filename, Params: string;
                           WindowState: word): boolean;
var
  SUInfo: TStartupInfo;
  ProcInfo: TProcessInformation;
  CmdLine: string;
begin
  //Dateinamen in Anführungszeichen wg. langer Dateinamen mit Blanks
  CmdLine := '"' + Filename + '"';

  FillChar(SUInfo, SizeOf(SUInfo), #0);
  with SUInfo do
  begin
    cb := SizeOf(SUInfo);
    dwFlags := STARTF_USESHOWWINDOW;
    wShowWindow := WindowState;
  end;

  Result := CreateProcess(PChar(CmdLine), PChar(params), nil, nil, FALSE,
                          CREATE_NEW_CONSOLE or NORMAL_PRIORITY_CLASS, nil,
                          PChar(ExtractFilePath(Filename)), SUInfo, ProcInfo);

  //Warten bis beendet
  if Result then
    WaitForSingleObject(ProcInfo.hProcess, INFINITE);
end;


//Button:
Execandwait(shortfilename('c:\treetagger\bin\CCCGraph.bat'),'"C:\TreeTagger\BIN\test.txt" "C:\treetagger\bin\tagged_test.txt"',sw_normal);
Et jeht nich! Nicht einmal die Batchdatei wird gestartet..

@Satty: Hast Du was anderes gemacht, als ich hier jetzt?!?

gruß, frieder

EDIT:

Mit

shellexecute(0, 'open', pchar('c:\treetagger\bin\CCCGraph.bat'), '"C:\TreeTagger\BIN\test.txt" "C:\treetagger\bin\tagged_test.txt"', nil, SW_NORMAL); wird zwar die Bat gestartet, aber die Params offenbar nicht korrekt übertragen..
  Mit Zitat antworten Zitat
Satty67

Registriert seit: 24. Feb 2007
Ort: Baden
1.566 Beiträge
 
Delphi 2007 Professional
 
#9

Re: Probleme mit kurzen und langen Dateinamen / Übergabe

  Alt 21. Mär 2009, 19:26
Ja, anders...

Delphi-Quellcode:
function ExecAndWait(const Filename, Params: string;
                           WindowState: word): boolean;
var
  SUInfo: TStartupInfo;
  ProcInfo: TProcessInformation;
  CmdLine: string;
begin
  //Dateinamen in Anführungszeichen wg. langer Dateinamen mit Blanks
  // Du muss jeden Parameter einzeln in " einschließen
>> CmdLine := '"' + Params + '"';
  // DAs klappt nicht, weil beide Parameter innerhalb " "

  FillChar(SUInfo, SizeOf(SUInfo), #0);
  with SUInfo do
  begin
    cb := SizeOf(SUInfo);
    dwFlags := STARTF_USESHOWWINDOW;
    wShowWindow := WindowState;
  end;
  
  // vvvvvvvvvvvvvv
  Result := CreateProcess(PChar(Filename), PChar(params), nil, nil, FALSE,
                          CREATE_NEW_CONSOLE or NORMAL_PRIORITY_CLASS, nil,
                          PChar(ExtractFilePath(Filename)), SUInfo, ProcInfo);

  //Warten bis beendet
  if Result then
    WaitForSingleObject(ProcInfo.hProcess, INFINITE);
end;
  Mit Zitat antworten Zitat
Satty67

Registriert seit: 24. Feb 2007
Ort: Baden
1.566 Beiträge
 
Delphi 2007 Professional
 
#10

Re: Probleme mit kurzen und langen Dateinamen / Übergabe

  Alt 21. Mär 2009, 19:28
ich sehe immer den gleichen Fehler!
Jeder Parameter muss einzeln in " " eingeschlossen werden, nicht die ganze CommandLine

rufe wie folgt auf:
CreateProcess(PChar(Filename), PChar(params), Filename: Nur der BAT-Dateiname, sonst nichts!

Params: zusammengesetzte Parameterliste = "Param1" "Param2"

Die Empfehlung ShortFileName zu verwenden, ist auch nicht ganz unwichtig. Könnte auch sein, das die Parameterliste sonst zu lang wird... keine Ahnung ob es da eine Grenze gibt... unter DOS gab es eine.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:13 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz