Entwickler-Ecke

Dateizugriff - Parameter aus String trennen


delphinia - Fr 03.03.06 17:07
Titel: Parameter aus String trennen
Ich habe einen String, der einen Pfad zu einer Datei inkl. eines Parameters enthält.

Bei der Prüfung mittels FileExists - ergibt es durch den parameter imm false. Wie bekomme ich den Parameter aus dem String?

Danke Euch für ein paar Ideen...


Martin1966 - Fr 03.03.06 17:18

Ich weiß nicht ob die Funktion ExtractFilePath und ExtractFileName mit Parameter im Dateinamen zurecht kommen. Hast du das mal ausprobiert? Wenn die damit zurecht kommen dann könnte man den String damit auseinander pfücken und dann wieder zusammenfügen. ;-)

Lg Martin


Fabian W. - Fr 03.03.06 17:19

normalerweise ist der parameter immer durch das letzte leerzeichen abgetrennt (wenns einer ist). Schau dir mal die function GetLastDelmiter (oä) an.


mfg


delphinia - Fr 03.03.06 17:31

Zitat:
Ich weiß nicht ob die Funktion ExtractFilePath und ExtractFileName mit Parameter im Dateinamen zurecht kommen. Hast du das mal ausprobiert? Wenn die damit zurecht kommen dann könnte man den String damit auseinander pfücken und dann wieder zusammenfügen.

Lg Martin


nein - ExtractFileName ist der störenfreid dieser behinhaltet auch den parameter



Zitat:
normalerweise ist der parameter immer durch das letzte leerzeichen abgetrennt (wenns einer ist). Schau dir mal die function GetLastDelmiter (oä) an.


mfg

ZU GetLastDelmiter habe ich weder hier im Forum noch etwas in der OH etwas gefunden...


raiguen - Fr 03.03.06 17:43

user profile iconFabian W. hat folgendes geschrieben:
normalerweise ist der parameter immer durch das letzte leerzeichen abgetrennt (wenns einer ist). Schau dir mal die function GetLastDelmiter (oä) an.


mfg


Moin :-)

Hat er Parameter immer eine feste Länge? Dann kannst du den DateiString um diese Länge 'kürzen' alá DateiString := Copy(DateiString, 1, Length(DateiString)-ParameterLaenge)

Wenn nein, dann geh ich mal davon aus, das der Parameter mit einem Leezeichen an den Dateinamen 'angehängt' ist (standard). Dann prüfe auf dieses Leerzeichen mittels Pos(' ',DateiString) und kopiere 'extrahiere'den DateiString: DateiString := Copy(DateiString, 1,Pos(' ',DateiString)-1)

Gruß


Martin1966 - Fr 03.03.06 17:46

Und was ist wenn der Dateinamen Leerzeichen enthält und was ist wenn mehrere Parameter eingetragen sind? Eventl. sind einige Parameter in Anführungszeichen eingeschlossen da diese auch Leerzeichen enthalten.

Hm. :gruebel:


delphinia - Fr 03.03.06 17:47

Zitat:
Wenn nein, dann geh ich mal davon aus, das der Parameter mit einem Leezeichen an den Dateinamen 'angehängt' ist (standard). Dann prüfe auf dieses Leerzeichen mittels Pos(' ',DateiString) und kopiere 'extrahiere'den DateiString: DateiString := Copy(DateiString, 1,Pos(' ',DateiString)-1)




dachte ich auch schon drann nur ist es mir derzeit schwer vorstellebar Gründe an 4 Beispiel gezeigt:


C:\Windows\date1.exe /para1 /para2
oder
c:\Windows\Data1.exe :para1
oder
c:\Windows\Data1.exe -para1
oder
"c:\Windows\Data1.exe" "-par a1"


daran sieht man das ja auch bei den parametern Leerzeichen sein können bespiel 1 und - es eventuell an einem bestimmten Zeichen festmachen, ist auch schwer da es zu viele möglichkeiten gibt unter Windows Parameter zu übergeben!


Martin1966 - Fr 03.03.06 18:02

Versuche mal die folgende Funktion. Diese schneidet die Parameter ab. Ich hoffe die funktioniert. ;-)


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:
function GetFilename (aFilename : String): String;
var
  p: Integer;
  sep: Boolean;
begin
  p := 0;
  sep := False;

  repeat
    Inc (p);

    if P > Length (aFilename) then
      Break
    else if (aFilename [p] = #32and not sep then
      begin
        Dec (p);
        Break;
      end
    else if (aFilename [p] = '"'then
      sep := Not sep;
  until False;

  if P > 0 then
    Result := Copy (aFilename, 1, p)
  else
    Result := '';
end;


Lg Martin


raiguen - Fr 03.03.06 18:05

user profile icondelphinia hat folgendes geschrieben:

ZU GetLastDelmiter habe ich weder hier im Forum noch etwas in der OH etwas gefunden...


Moin :-)

Das gibt's auch nicht;-) ABER: IsDelimiter, IsPathDelimiter, LastDelimiter... gehört alles zu den SysUtils.
Das nur mal nebenbei bemerkt. Allerdings fin dich die Funktionen nicht so berauschend; kann man auch mit Pos-Funktion hinbekommen ;-)

Gruß


Martin1966 - Fr 03.03.06 18:09

user profile iconraiguen hat folgendes geschrieben:
kann man auch mit Pos-Funktion hinbekommen ;-)

Mit Pos? Hm. Gibt doch mal ein Biespiel wie du das mit Pos machen würdest.


delphinia - Fr 03.03.06 18:35

user profile iconMartin1966 hat folgendes geschrieben:
Versuche mal die folgende Funktion. Diese schneidet die Parameter ab. Ich hoffe die funktioniert. ;-)


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:
function GetFilename (aFilename : String): String;
var
  p: Integer;
  sep: Boolean;
begin
  p := 0;
  sep := False;

  repeat
    Inc (p);

    if P > Length (aFilename) then
      Break
    else if (aFilename [p] = #32and not sep then
      begin
        Dec (p);
        Break;
      end
    else if (aFilename [p] = '"'then
      sep := Not sep;
  until False;

  if P > 0 then
    Result := Copy (aFilename, 1, p)
  else
    Result := '';
end;


Lg Martin



das sieht derzeit sehr gut aus!

Danke Dir


Martin1966 - Fr 03.03.06 18:46

Bitte. Kannst es ja mal etwas genauer testen. Wenn es funktioniert oder Du einen Fehler findest dann sag bitte bescheid.

Anschl. packe ich die Funktion in die Delphi-Library. ;-)


raiguen - Fr 03.03.06 18:55

user profile icondelphinia hat folgendes geschrieben:

dachte ich auch schon drann nur ist es mir derzeit schwer vorstellebar Gründe an 4 Beispiel gezeigt:


C:\Windows\date1.exe /para1 /para2
oder
c:\Windows\Data1.exe :para1
oder
c:\Windows\Data1.exe -para1
oder
"c:\Windows\Data1.exe" "-par a1"


daran sieht man das ja auch bei den parametern Leerzeichen sein können bespiel 1 und - es eventuell an einem bestimmten Zeichen festmachen, ist auch schwer da es zu viele möglichkeiten gibt unter Windows Parameter zu übergeben!


Moin :-)

Ähm, stimmt... hab ich beim meinen Überlegungne nicht bedacht.

Aber ich hab da nen andere Idee:

Davon ausgehend, das im Dateinamen immer eine Extension alà .exe oder ähnliches vorhanden ist, kann man die Funktion ExtractFileExt(DateiString) nutzen.
Beispiel: ExtractFileExt('C:\Windows\date1.exe /para1 /para2') ergibt .exe /para1 /para2

Also könnte das Rausfischen des dateiNames wie folgt aussehen

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
function DateiNameOhneParameter(CONST DateiString: String): String;
var ExtString: String;
    nPosLeer, nPosExt: Integer;
begin
  RESULT := '';
  //-- nur die DaeiEndung einschließlich der Parameter
  ExtString := ExtractFileExt(DateiString);
  
//-- Position im übergebenen DateiNamen feststellen
  nPosExt := Pos(ExtString, DateiString);

  //--erstes Leerzeichen feststellen steht in der Regel vor dem Parameter
  nPosLeer := Pos(' ',ExtString);

//-- nun den Dateinamen ohne die Parameter rauskopieren
  RESULT := Copy(DateiString, 1, nPosExt+nPosLeer-1);

end;


Das funktioniert auch bei Dateinamenmit einer Leerstelle oder Punkt (Ausser dem Punkt bei der Extension). Allerdings darf bei den Parametern KEIN Doppelpunkt (siehe Beispiel 2) vorangestellt sein, da die ExtractFileExt-Funktion diesen als Teils vom Laufwerksbezeichner (C: etc) interpertiert...

Good luck.. und wie gesagt: nur ein Denkanstoß ;-)

Gruß