Entwickler-Ecke

Dateizugriff - Pfad inkl. Dateiname aus String ermitteln


schitho - Mo 07.03.05 23:43
Titel: Pfad inkl. Dateiname aus String ermitteln
Hi,

wie kann ich aus einem String den Pfad inkl. Dateiname ermitteln.

Beispiel:

Aus

C:\Programme\AVPersonal\AVGNT.EXE /min soll C:\Programme\AVPersonal\AVGNT.EXE werden.

Oder:

"C:\Programme\Zone Labs\ZoneAlarm\zlclient.exe" -> C:\Programme\Zone Labs\ZoneAlarm\zlclient.exe

RUNDLL32.EXE C:\WINDOWS\system32\NvCpl.dll,NvStartup -> RUNDLL32.EXE


Oder anders gesagt:

Ich möchte die Anführungszeichen und die Parameter entfernen.

Wie mach ich das?

Gruß
Thomas


Karlson - Mo 07.03.05 23:53

Überprüfe mit Suche in: Delphi-Forum, Delphi-Library POS wo die Zeichen auftreten, und lösche sie bzw. lösche die Zeichen danach.


schitho - Di 08.03.05 00:14

Danke für Deine Antwort.

Hab es nun so gelöst:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
function DeleteZeichen(s,z:string): string;
begin
  if Pos(z,s)>0 then
  begin
    Delete(s,Pos(z,s),1);
    s:=DeleteZeichen(s,z);
  end;
  result:=s;
end;

function DeleteParam(s:string):string;
// Quelle: http://www.delphi-forum.de/viewtopic.php?t=21430&highlight=endungen+extractfilepath
const
  Endungen : array[0..2of string[4] =
    ('.exe','.bat','.com');
var
  t : string;
  a, b : Integer;
begin
  s:=DeleteZeichen(s,'"');
  t:=ExtractFileName(s);
  for a:=0 to 2 do
  begin
    b:=Pos(Endungen[a]+' ',LowerCase(t));
    if b > 0 then
    begin
      t:=Copy(t,1,b+3);
      Break;
    end;
  end;
  result:=ExtractFilePath(s)+t;
end;


Gruß
Thomas


Martin77 - Di 08.03.05 08:42


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
   for a:=0 to 2 do
  begin
    b:=Pos(Endungen[a]+' ',LowerCase(t));
    if b > 0 then
    begin
      t:=Copy(t,1,b+3);
      Break;
    end;
  end;


Kleiner Tipp:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
  for a:=[b]low(Endungen)[/b] to [b]High(Endungen)[/b] do
  begin
    b:=Pos(Endungen[a]+' ',LowerCase(t));
    if b > 0 then
    begin
      t:=Copy(t,1,b+3);
      Break;
    end;
  end;



Wenn du low und high verwendest bekommst Du immer das untere und obere Ende deines Arrays, falls Du noch eine Erweiterung hinzufügst müßtest du am sonstigen Quelltext nichts mehr ändern


Zur Pos Abfrage der Endung:c:\Programme\Meine.exe-Verzeichnisse\Programm.ini

das .exe solltest du nicht beachten.

Martin


Delete - Di 08.03.05 11:11

Es gibt schon ein paar nette Funktionen im Betriebssystem, die man nutzen kann. Weil es OS-Funktionen sind, geht es mit PChar natürlich einfacher:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
procedure TForm1.Button1Click(Sender: TObject);
var
  s  : array[0..MAX_PATH]of char;
begin
  ZeroMemory(@s,sizeof(s));
  lstrcpy(s,'RUNDLL32.EXE C:\WINDOWS\system32\NvCpl.dll,NvStartup');

  PathRemoveArgs(s);     // Parameter entfernen
  PathUnquoteSpaces(s);  // Anführungszeichen entfernen (wenn vorhanden)

  ShowMessage(s);
end;

Mit Strings müsstest du etwas mehr hantieren:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
procedure TForm1.Button1Click(Sender: TObject);
var
  s : string;
begin
  SetLength(s,MAX_PATH);
  lstrcpy(@s[1],'"C:\Programme\Zone Labs\ZoneAlarm\zlclient.exe"');
  SetLength(s,lstrlen(pchar(s)));

  PathRemoveArgs(@s[1]);
  PathUnquoteSpaces(@s[1]);

  ShowMessage(s);
end;

Wie gesagt, es gibt noch weitere wirklich gute Funktionen, die ich auch schon mal hier im Forum vorgestellt [http://www.delphi-forum.de/viewtopic.php?t=28630] habe.