Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi [XE] Bug in TDirectory.Copy, gibts schon einen QC eintrag? (https://www.delphipraxis.net/181718-%5Bxe%5D-bug-tdirectory-copy-gibts-schon-einen-qc-eintrag.html)

Memnarch 4. Sep 2014 15:31


[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:
TDirectory.Copy('C:\Foo', 'D:\Target')
Bei folgendem geht es aber nicht, der Ordner FooB ist dann nämlich leer:

Delphi-Quellcode:
TDirectory.Copy('C:\Foo\', 'D:\Target')
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)

Die Länge des SourceDir-Strings wird allerdings falsch berechnet, nämlich so:

Delphi-Quellcode:
Length(SourceDir) + Length('\')
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

Delphi-Quellcode:
Length(IncludeTrailingPathDelimiter(SourceDir))
besser gewesen.

Jedenfalls: Gibts diesen Bug in den folgeversionen noch oder vllt schon einen QC Eintrag, den ich nur übersehen habe?

MFG
Memnarch

Sir Rufo 4. Sep 2014 15:48

AW: [XE] Bug in TDirectory.Copy, gibts schon einen QC eintrag?
 
Ich sehe das gar nicht als Bug an.
Delphi-Quellcode:
TDirectory = class
...
class procedure Copy(const SourceDirName, DestDirName: string); static;
...
end;
Da steht also etwas von
Delphi-Quellcode:
SourceDirname
und
Delphi-Quellcode:
DestDirName
und nicht etwa
Delphi-Quellcode:
SourcePath
oder
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:
Path = C:\Foo\
Directory = C:\Foo
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. ;)

Faxe 4. Sep 2014 16:27

AW: [XE] Bug in TDirectory.Copy, gibts schon einen QC eintrag?
 
Aber die Hilfe redet von Pfaden:

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.

Sir Rufo 4. Sep 2014 16:34

AW: [XE] Bug in TDirectory.Copy, gibts schon einen QC eintrag?
 
Zitat:

Zitat von Faxe (Beitrag 1271057)
Aber die Hilfe redet von Pfaden:

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.

Ja, auch bei Emba gibt es Menschen, die den Unterschied zwischen einem Verzeichnis und einem Pfad nicht kennen.
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.

Uwe Raabe 4. Sep 2014 16:34

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.

Sir Rufo 4. Sep 2014 16:43

AW: [XE] Bug in TDirectory.Copy, gibts schon einen QC eintrag?
 
Zitat:

Zitat von Uwe Raabe (Beitrag 1271060)
Also bei XE2-XE7 wird unterschieden, ob das letzte Zeichen ein Path-Separator ist oder nicht.

Ähm, du meinst sicher Delphi-Referenz durchsuchenTPath.DirectorySeparatorChar und nicht Delphi-Referenz durchsuchenTPath.PathSeparator

Uwe Raabe 4. Sep 2014 19:10

AW: [XE] Bug in TDirectory.Copy, gibts schon einen QC eintrag?
 
Zitat:

Zitat von Sir Rufo (Beitrag 1271063)
Zitat:

Zitat von Uwe Raabe (Beitrag 1271060)
Also bei XE2-XE7 wird unterschieden, ob das letzte Zeichen ein Path-Separator ist oder nicht.

Ähm, du meinst sicher Delphi-Referenz durchsuchenTPath.DirectorySeparatorChar und nicht Delphi-Referenz durchsuchenTPath.PathSeparator

Nein, ich habe ja auch gar nicht TPath.PathSeparator erwähnt.

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.

Sir Rufo 4. Sep 2014 19:36

AW: [XE] Bug in TDirectory.Copy, gibts schon einen QC eintrag?
 
Zitat:

Zitat von Uwe Raabe (Beitrag 1271079)
Zitat:

Zitat von Sir Rufo (Beitrag 1271063)
Zitat:

Zitat von Uwe Raabe (Beitrag 1271060)
Also bei XE2-XE7 wird unterschieden, ob das letzte Zeichen ein Path-Separator ist oder nicht.

Ähm, du meinst sicher Delphi-Referenz durchsuchenTPath.DirectorySeparatorChar und nicht Delphi-Referenz durchsuchenTPath.PathSeparator

Nein, ich habe ja auch gar nicht TPath.PathSeparator erwähnt.

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.

Oh, da stimmt die Namensgebung auch nicht so richtig überein ...

Uwe Raabe 4. Sep 2014 21:07

AW: [XE] Bug in TDirectory.Copy, gibts schon einen QC eintrag?
 
Zitat:

Zitat von Sir Rufo (Beitrag 1271082)
Oh, da stimmt die Namensgebung auch nicht so richtig überein ...

Nicht nur das - die Implementation ist auch buggy: Endet der Pfad mit einem Doppelpunkt, wird fälschlicherweise nämlich kein Backslash eingefügt. Aber wer kopiert auch schon ganze Laufwerke, nicht wahr?:roll:

Memnarch 4. Sep 2014 22:07

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.

himitsu 4. Sep 2014 22:31

AW: [XE] Bug in TDirectory.Copy, gibts schon einen QC eintrag?
 
Das ist auch ein Grund, warum ich diese Unit nur "bedingt" und mit Bedacht verwende.
Ich weiß jetzt nicht wie es in XE aussah, aber in XE3 ist dieses Copy noch Schrott und in XE6 sieht es irgendwie genau gleich aus. (noch keine Zeit XE7 zu installieren, aber ich glaub nicht daß sich da was geändert hat)


Diese Unit hätte zwar Potential, aber durch solche Bugs und durch das krankhafte Vertecken interner Funktion ist es manchmal einfach nicht benutzbar.
Schon alleine die Dateisuchfunktionen sind schlimm, und am Ende kommt man vielleicht besser das selber zu machen. (Verzeichnisse ignorieren ging z.B. nicht)

hathor 13. Jan 2015 09:15

AW: [XE] Bug in TDirectory.Copy, gibts schon einen QC eintrag?
 
In XE7 ist es auch Schrott!
UNBRAUCHBAR!

Der schöne Günther 13. Jan 2015 09:24

AW: [XE] Bug in TDirectory.Copy, gibts schon einen QC eintrag?
 
Na dann könnte man nach über vier Monaten doch langsam mal den Fehler melden, oder?

Uwe Raabe 13. Jan 2015 10:58

AW: [XE] Bug in TDirectory.Copy, gibts schon einen QC eintrag?
 
Zitat:

Zitat von Der schöne Günther (Beitrag 1286402)
Na dann könnte man nach über vier Monaten doch langsam mal den Fehler melden, oder?

Gibt's doch schon:

https://quality.embarcadero.com/browse/RSP-9763
https://quality.embarcadero.com/browse/RSP-9887
https://quality.embarcadero.com/browse/RSP-9622
https://quality.embarcadero.com/browse/RSP-9620

Der schöne Günther 13. Jan 2015 11:22

AW: [XE] Bug in TDirectory.Copy, gibts schon einen QC eintrag?
 
Ok, hatte ich im Thema hier nicht entdeckt. Dann darf man sich natürlich aufregen ;-)

Uwe Raabe 13. Jan 2015 12:07

AW: [XE] Bug in TDirectory.Copy, gibts schon einen QC eintrag?
 
Zitat:

Zitat von Der schöne Günther (Beitrag 1286413)
Dann darf man sich natürlich aufregen ;-)

Das kann man so sehen oder nicht.

Alle Einträge beziehen sich auf XE7. Der älteste datiert vom 24. Oktober. XE7 Update 1 ist am 14. November erschienen. Das wäre schon recht knapp, um das in dem Update noch mit unterzubringen. Wenn es kein Update 2 mehr gibt, dann erwarte ich realistisch erst mit XE8 eine Fehlerbehebung.

Der schöne Günther 13. Jan 2015 12:11

AW: [XE] Bug in TDirectory.Copy, gibts schon einen QC eintrag?
 
Ich habe das Thema jetzt nicht im Detail gelesen, aber ich dachte es ging um
Delphi-Quellcode:
System.IoUtils.TDirectory.Copy
? Die vier Links behandeln
Delphi-Quellcode:
System.Generics.Collections.TArray.Copy<T>

mjustin 13. Jan 2015 12:34

AW: [XE] Bug in TDirectory.Copy, gibts schon einen QC eintrag?
 
Zitat:

Zitat von Der schöne Günther (Beitrag 1286418)
ich dachte es ging um
Delphi-Quellcode:
System.IoUtils.TDirectory.Copy
? Die vier Links behandeln
Delphi-Quellcode:
System.Generics.Collections.TArray.Copy<T>

:spin2:
Dafür gibt es doch StringReplace:

Delphi-Quellcode:
Result := StringReplace(GesamterText, 'TDirectory.Copy', 'TArray.Copy', [rfReplaceAll, rfIgnoreCase]);

Uwe Raabe 13. Jan 2015 13:24

AW: [XE] Bug in TDirectory.Copy, gibts schon einen QC eintrag?
 
Zitat:

Zitat von Der schöne Günther (Beitrag 1286418)
Ich habe das Thema jetzt nicht im Detail gelesen, aber ich dachte es ging um
Delphi-Quellcode:
System.IoUtils.TDirectory.Copy
? Die vier Links behandeln
Delphi-Quellcode:
System.Generics.Collections.TArray.Copy<T>

Mein Fehler :oops: Ich hatte das mit einem anderen Thread verwechselt.

Memnarch 13. Jan 2015 13:40

AW: [XE] Bug in TDirectory.Copy, gibts schon einen QC eintrag?
 
Verzeit den Mangel an Rückmeldung. Im Wust der Arbeit vergessen mich zurückzumelden.

Wir hatten bei uns intern eine Diskussion darüber. In der Copymethode heißt es ja ganz genau SourceDirName/DestDirName. andere Entwickler waren der Meinung, dass dies prinzipiel so richtig ist. Ein directoryname hat kein Backslash zubeinhalten, ansonsten wäre es SourceDirectory/DestDirectory. Bleibt dann noch der streitpunkt, ob man dann nicht zumindest einfach ne exception wirft wenn ein '\' am Ende steht. Das wäre zumindest dann mein Wunsch.

PS:
QC einträge werden noch wiegehabt erstellt, oder wie landen die bei denen im neuen Jira?

Grüße
Memnarch

Stevie 13. Jan 2015 17:07

AW: [XE] Bug in TDirectory.Copy, gibts schon einen QC eintrag?
 
Zitat:

Zitat von Memnarch (Beitrag 1286428)
Ein directoryname hat kein Backslash zubeinhalten, ansonsten wäre es SourceDirectory/DestDirectory.

Du meinst wohl SourcePath/DestPath.

Zu der Thematik hatten wir doch neulich erst was :)


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:54 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz