Entwickler-Ecke

Dateizugriff - letztes Zeichen aus PAnsiChar ???


rob87 - Mi 19.11.08 15:50
Titel: letztes Zeichen aus PAnsiChar ???
Hallo wiedermal,

Ich hab folgenden Sachverhalt:
Ich will ein PDF in den Eigenen Dateien des Users speichern. Soweit sogut. Nur habe ich nun grad bemerkt, dass mein Programm einen Fehler bringt, wenn der Eigene-Dateien-Pfad als letzten Buchstaben ein "\" hat.
Dann löst er nämlich die Datei in der Art auf Bsp.: "D:\\test1.pdf" und nicht "D:\test1.pdf"

Daher brauch ich eine Unterscheidung bez. des letzten Zeichens des Pfades.
Mein Pfad ist vom Typ:

Delphi-Quelltext
1:
path: Array [0..Max_Path] Of Char                    

Wie krieg ich nun das letzte Zeichen dieses Char-Arrays?

Meine Vorgehensweise wäre dann:

Delphi-Quelltext
1:
2:
3:
4:
5:
if letztesZeichen von path = "\" then
  RvSystem1.OutputFileName := 'test1.pdf';
else
  RvSystem1.OutputFileName := '\test1.pdf';
i


azubi_20 - Mi 19.11.08 16:56


Delphi-Quelltext
1:
2:
3:
4:
if path[Max_Path] = "\" then
  RvSystem1.OutputFileName := 'test1.pdf';
else
  RvSystem1.OutputFileName := '\test1.pdf';


rob87 - Mi 19.11.08 17:14

user profile iconazubi_20 hat folgendes geschrieben Zum zitierten Posting springen:

Delphi-Quelltext
1:
2:
3:
4:
if path[Max_Path] = "\" then
  RvSystem1.OutputFileName := 'test1.pdf';
else
  RvSystem1.OutputFileName := '\test1.pdf';

Soweit war ich auch schon. Aber ich brauch ned des letzte Zeichen von dem Array. Sondern des letzte beschriebene.

Da muss ich dann wahrsch. mit ner Schleifen arbeiten?? Dafür gibts keine Funktion?


azubi_20 - Mi 19.11.08 17:25

Du kannst dir ja mit ner Schleife ne eigene Funktion bauen.

BTW: den Pfad für "Eigene Dateien bekommt man so : GetShellDirectoryEx(CSIDL_PERSONAL, 'Personal');


rob87 - Mi 19.11.08 17:28

user profile iconazubi_20 hat folgendes geschrieben Zum zitierten Posting springen:
Du kannst dir ja mit ner Schleife ne eigene Funktion bauen.

Hmmm :-( Ich befürchts. Entweder das oder eine Funktion zur Umwandlung von String in PAnsiChar.
user profile iconazubi_20 hat folgendes geschrieben Zum zitierten Posting springen:

BTW: den Pfad für "Eigene Dateien bekommt man so : GetShellDirectoryEx(CSIDL_PERSONAL, 'Personal');

Muss ma dafür irgendwelche Units einbinden? Oder von welchem Typ ist "GetShellDirectoryEx"? Bei mir meckert er den Bezeichner an. Denn bei deiner Variante bräucht ich keine Variable vom Typ PAnsiChar. Sondern könnt einfach einen String nehmen. Und bei nem String wirds doch wohl die Möglichkeit geben, das letzte Zeichen rauszukriegen ---> copy(sPath,last,1) //wobei hier "last" eben noch nicht bekannt ist

Ich habs so gemacht:

Delphi-Quelltext
1:
2:
SHGetSpecialFolderLocation(0,CSIDL_PERSONAL, pIDL);
SHGetPathFromIDList(pIDL,path);

;-)


Delete - Mi 19.11.08 17:46

Es gibt da noch die Funktion IncludeTrailingPathDelimiter in SysUtils. Wäre wahrscheinlich einfacher ;)


Reinhard Kern - Mi 19.11.08 18:56

user profile iconrob87 hat folgendes geschrieben Zum zitierten Posting springen:
...
Soweit war ich auch schon. Aber ich brauch ned des letzte Zeichen von dem Array. Sondern des letzte beschriebene.

Da muss ich dann wahrsch. mit ner Schleifen arbeiten?? Dafür gibts keine Funktion?


Gibts (Ptr ist PChar): Ptr := StrEnd (MyPChar) - 1;

Gruss Reinhard

Moderiert von user profile iconmatze: Delphi-Tags hinzugefügt


Delete - Mi 19.11.08 19:07


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
uses SHFolder;

function GetUserPath(out sPath: string): Boolean;
begin
  SetLength(sPath,MAX_PATH);
  SHGetFolderPath(0,CSIDL_PERSONAL,0,0,PAnsiChar(sPath));
  SetLength(sPath,StrLen(PAnsiChar(sPath)));
  Result := Length(sPath) > 0;
  if Result then 
    sPath := IncludeTrailingPathDelimiter(sPath);
end;


Gibt bei Erfolg den Pfad zu den eigenen Dateien samt Backslash zurück.


rob87 - Mo 01.12.08 11:59

user profile iconazubi_20 hat folgendes geschrieben Zum zitierten Posting springen:
Du kannst dir ja mit ner Schleife ne eigene Funktion bauen.

BTW: den Pfad für "Eigene Dateien bekommt man so : GetShellDirectoryEx(CSIDL_PERSONAL, 'Personal');


Hast du da irgendwelche Units eingebunden? Ich denk, der braucht da bei mir noch eine Unit...


rob87 - Mo 01.12.08 15:25

Frage beantwortet. Thread beendet. Merci an alle