Entwickler-Ecke

Dateizugriff - ExtractFileName + ' String'


teamrocket0 - Mi 26.12.18 02:17
Titel: ExtractFileName + ' String'
Nur ganz kurz.

Ich möchte gerne hinter einer String-Variable die über Drag & Drop gefüllt wird einen weiteren String anfügen.
Es geht hier nur um einen kleinen Backslash.

Unter Delphi 7 funktioniert das so.

Delphi 7:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
procedure TForm1.OnFileDrop1FileDrop(filename: String);
begin
if DirectoryExists(filename)then begin
Form1.Memo1.Lines.Add('Folder: ' + extractfilename(filename) + '\');
end else begin
Form1.Memo1.Lines.Add('Path: ' + extractfilepath(fileName));
Form1.Memo1.Lines.Add('File: ' + extractfilename(filename));
end;
end;


Ergebnis im Memo-Feld:

Delphi-Quelltext
1:
Folder: Funktionen\                    



Unter Delphi 10.2 funktioniert das so aber NICHT...WARUM.... :bawling:

Delphi 10.2 Tokyo:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
procedure TForm1.DragDrop(var Message: TWmDropFiles);
var
Filename: String;
begin
SetLength(Filename,2000);
DragQueryFile(Message.Drop,0,Pchar(Filename),2000);
if directoryexists(Filename)= true then begin
Form1.Memo1.Lines.Add('Folder: ' + ExtractFileName(Filename) + '\');
end else begin
Form1.Memo1.Lines.Add('Path: ' + ExtractFilePath(Filename));
Form1.Memo1.Lines.Add('File: ' + ExtractFileName(Filename));
end;
end;


Ergebniss im Memo-Feld:

Delphi-Quelltext
1:
Folder: Funktionen                    


Es ist egal, was für einen String ich anfügen möchte. Alles nach der Variable wird nicht mehr in die Memo-Zeile eingefügt.

Wenn an der Stelle von "Filename" eine andere "Random-String-Variable" steht, funktioniert das mit dem '\' hinzufügen.
Wird "Filename" in eine andere "Random-String-Variable" kopiert (Random:=Filename;) funktioniert es wiederum nicht mit dem '\' hinzufügen.
Wenn jemand eine Antwort darauf parat hat, würde ich mich über eine kurze Antwort freuen.

Mit besten Grüßen

teamrocket0


Sinspin - Mi 26.12.18 05:25

Hallo,

es gibt eine Funktion mit der man den Pfadtrenner an einen String anhängen kann : IncludeTrailingPathDelimiter.
Ich vermute mal, dass es daran liegt das du von PChar kommst und da irgendwie am Ende die Null hinten dran hängen bleibt.
Kannst ja via StringReplace mal versuchen die gefundene Null-Zeichen zu entfernen.


Gausi - Mi 26.12.18 10:07

Du mischst hier PChar und String auf unzulässige Art und Weise. ;-)

Zuerst setzt du die Länge eines Strings auf 2000, schreibst dann was rein und fügst am Ende was hinzu. D.h. dein String sieht dann wahrscheinlich so aus

Quelltext
1:
c:\meinOrdner\meinsubdir\file.txt...............................................................\                    

Wobei die ganzen (fast 2000) "." möglicherweise Datenmüll oder Nullbytes sind (weiß nicht, wie da initialisiert wird). DirectoryExists castet dann wieder zurück auf PChar, und findet das Verzeichnis. Delphis String-Konkatenation nimmt aber wohl den ganzen String bis zum Ende ;-)

Richtig wäre:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
var
  Filename: PChar;
  len: Integer;
begin
  len := DragQueryFile(Message.Drop, 0NIL0);
  Filename := StrAlloc(len+2);
  DragQueryFile(Message.Drop, 0, filename, len+2);
  // +2 wegen Widestring/Unicode mit Doppelnull am Ende.


Edit: Du kannst aber auch mit

Delphi-Quelltext
1:
if (FileGetAttr(Filename) AND faDirectory = faDirectory) then                    

überprüfen, ob das File ein Verzeichnis ist. Das sollte sauberer sein als der Test auf DirectoryExists.


teamrocket0 - Mi 26.12.18 11:26

Und wiedereinmal war es Gausi, der mir geholfen hat. Ich frage mich nur, was er in seiner Freizeit macht...^^

Besten Dank.

teamrocket0