![]() |
[XE] Bug in TDirectory.Copy, gibts schon einen QC eintrag?
Moin,
Habe einen Bug in TDirectory.Copy festgestellt. Habe nachgeguckt ob es bereits einen QC-Eintrag gibt, schien aber nicht so(vllt hab ich auch falsch gesucht, kann das jemand bestätigen?). Könntet ihr vllt einmal nachgucken, ob der Bug in einer der Folgeversionen (xe2-xe7, jenachdem was ihr habt) gefixxt wurde? Der Bug: Normalerweise kopiert TDirectory.Copy die Ordnerstruktur von Source nach Destination, undzwar rekursiv. Wenn ich folgenden pfad habe: C:\Foo\FooB\File.txt kann ich folgendes machen um alles zu kopieren:
Delphi-Quellcode:
Bei folgendem geht es aber nicht, der Ordner FooB ist dann nämlich leer:
TDirectory.Copy('C:\Foo', 'D:\Target')
Delphi-Quellcode:
Kaputt geht es nur, weil am Ende ein Backslash angefügt wurde. In der Methode gibt es einen aufruf zu StuffString, dort möchte man den SourcePfad vom kompletten Pfad am Anfang abschneiden(also praktisch soetwas wie ExtractRelativePath)
TDirectory.Copy('C:\Foo\', 'D:\Target')
Die Länge des SourceDir-Strings wird allerdings falsch berechnet, nämlich so:
Delphi-Quellcode:
Es wird also immer ein Backslash dazugerechnet, hat der Pfad also bereits eines, geht der erste Buchstabe des relativen Pfades verloren. TFile.Copy schlägt dann fehl(was auch nicht zurückgegeben wird). Wahrscheinlich wäre
Length(SourceDir) + Length('\')
Delphi-Quellcode:
besser gewesen.
Length(IncludeTrailingPathDelimiter(SourceDir))
Jedenfalls: Gibts diesen Bug in den folgeversionen noch oder vllt schon einen QC Eintrag, den ich nur übersehen habe? MFG Memnarch |
AW: [XE] Bug in TDirectory.Copy, gibts schon einen QC eintrag?
Ich sehe das gar nicht als Bug an.
Delphi-Quellcode:
Da steht also etwas von
TDirectory = class
... class procedure Copy(const SourceDirName, DestDirName: string); static; ... end;
Delphi-Quellcode:
und
SourceDirname
Delphi-Quellcode:
und nicht etwa
DestDirName
Delphi-Quellcode:
oder
SourcePath
Delphi-Quellcode:
.
DestPath
Und ein Path zeichnet sich immer durch einen PathDelimiter am Ende aus und ein Directory durch einen fehlenden PathDelimiter am Ende.
Code:
Wenn du also jetzt statt eines Directory einen Path übergibst, dann hast du einfach einen falschen Wert übergeben, erwartest aber, dass es trotz falscher Werte richtig funktioniert. ;)
Path = C:\Foo\
Directory = C:\Foo |
AW: [XE] Bug in TDirectory.Copy, gibts schon einen QC eintrag?
Aber die
![]() Use Copy to copy a directory and its contents from a given path to another path. :) SourceDirName The path of the source directory that will be copied. DestDirName The destination path to which the directory will be copied. |
AW: [XE] Bug in TDirectory.Copy, gibts schon einen QC eintrag?
Zitat:
Noch schlimmer ist es allerdings, dass es auch Entwickler bei Emba gibt, die den nicht kennen und Verzeichnis schreiben und Pfad meinen, bzw. Pfad schreiben und Verzeichnis meinen. |
AW: [XE] Bug in TDirectory.Copy, gibts schon einen QC eintrag?
Also bei XE2-XE7 wird unterschieden, ob das letzte Zeichen ein Path-Separator ist oder nicht.
|
AW: [XE] Bug in TDirectory.Copy, gibts schon einen QC eintrag?
Zitat:
![]() ![]() |
AW: [XE] Bug in TDirectory.Copy, gibts schon einen QC eintrag?
Zitat:
Die Abfrage heißt
Delphi-Quellcode:
if not TPath.IsPathSeparator(Ch) then
was zwar in der Nomenklatur obigen Schluss zulassen würde, aber ganz anders implementiert ist. |
AW: [XE] Bug in TDirectory.Copy, gibts schon einen QC eintrag?
Zitat:
|
AW: [XE] Bug in TDirectory.Copy, gibts schon einen QC eintrag?
Zitat:
|
AW: [XE] Bug in TDirectory.Copy, gibts schon einen QC eintrag?
Naja, alles was nicht mit einem Backslash endet scheint eher ein Dateiname zu sein(Soweit sehen es zumindest z.B. die Winapi funktionen).
Und auch ExtractRelativePath würde das letzte Element als Dateiname nehmen, wenn "\" fehlt. Und zumindest hätte ich bei der Exception-Politik erwartet, dass es dann mit einer Exception in die binsen geht. Zumindest den Resultwert von TFile.Copy hätte man verwerten können. Es kann schließlich auch nicht sein, dass eine funktion ohne Probleme durchrennt und dann nicht funktioniert hat. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:44 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz