Datei kopieren Win 7 64bit

Antworten
VB_Lazarus
Beiträge: 90
Registriert: Do 23. Dez 2010, 19:10
OS, Lazarus, FPC: Windows 10/11 32/64bit, L 2.2.0 32bit, FPC 3.2.2 32bit
CPU-Target: 32Bit

Datei kopieren Win 7 64bit

Beitrag von VB_Lazarus »

Hallo,

habe folgendes Problem.

In meinem Programm versuche ich über die Funktion CopyFile Dateien zu kopieren.
Dies gelingt, sofern die Dateien oder das Verzeichnis keine Sonderzeichen, wie ß, ü, [ usw. haben.
Sobald diese Zeichen vorhanden sind, wird die Datei nicht kopiert.
Mit der Windows shellapi habe ich es auch versucht.
Gleicher Effekt.
Ich habe es auch mit dem TFileStream Objekt versucht.
Dort kam aber nur eine Fehlermeldung, das auf die Datei nicht zugegriffen werden kann.
Komischerweise kann ich alles (Dateiname) korrekt auslesen.
Ich speichere die Information (Name, Verzeichnis) auch in eine Datenbank.
Vielleicht kennt jemand dieses Problem.

Danke.

Gruß

Benutzeravatar
theo
Beiträge: 10497
Registriert: Mo 11. Sep 2006, 19:01

Re: Datei kopieren Win 7 64bit

Beitrag von theo »

Wahrsch. verwendest du das von Unit windows. Nimm das von FileUtil:
FileUtil.CopyFile(..);

Mathias
Beiträge: 6193
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Datei kopieren Win 7 64bit

Beitrag von Mathias »

Es geht auch mit der WinApi, aber der Aufwand ist viel grösser.

Code: Alles auswählen

Windows.CopyFile(PChar(UTF8ToSys('ä.txt')), PChar(UTF8ToSys('ü.txt')), True);


Die Unit Windows würde ich nur einbinden, wen es anderst nicht geht.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

VB_Lazarus
Beiträge: 90
Registriert: Do 23. Dez 2010, 19:10
OS, Lazarus, FPC: Windows 10/11 32/64bit, L 2.2.0 32bit, FPC 3.2.2 32bit
CPU-Target: 32Bit

Re: Datei kopieren Win 7 64bit

Beitrag von VB_Lazarus »

Erst mal danke an euch.

Theo, es funktioniert.
Meine Uses sieht wie folgt aus:

Code: Alles auswählen

uses
  Classes, SysUtils, db, odbcconn, sqldb, FileUtil, RTTICtrls, LR_DBSet,
  LR_Class, LR_Desgn, LR_View, LR_ChBox, LR_Shape, LR_RRect, LR_PGrid, LR_E_CSV,
  LRDialogControls, Forms, Controls, Graphics, Dialogs, DBGrids, DbCtrls,
  StdCtrls, ActnList, Menus, ComCtrls, Buttons, ExtCtrls, EditBtn, INIFiles,
  Windows, Grids, ShellCtrls, ExtDlgs, types, DateUtils, ShellAPI, ShlObj;
 

Ich denke die FileUtil und die Windows haben eine CopyFile.
Die von FilUtil wird später von der Windows überschrieben.
Ist das richtig?
Woher weiss ich welche Funktionen wo drin sind?
Warum funktioniert die Windows nicht?
Ich nehme an, das jetzt die CopyFile von Windows bei mir benutzt wird und nicht funktioniert.
Gruß

Benutzeravatar
theo
Beiträge: 10497
Registriert: Mo 11. Sep 2006, 19:01

Re: Datei kopieren Win 7 64bit

Beitrag von theo »

Es wird immer der hinterste Eintrag in der uses clause bevorzugt genommen.
Nimm "windows" an den Anfang, dann haben allfällige gleichnamige Lazarus Funktionen den Vortritt.

Die Funktionen in "Windows" gehen direkt aufs Windows API. Das Windows API weiss nicht, dass von Lazarus UTF-8 Strings kommen, die Variante in FileUtil macht es richtig.

Idealerweise verwendtet man unit windows in Lazarus aber gar nicht, damit die Anwendung plattformunabhängig bleibt.

Bitschubser
Beiträge: 61
Registriert: Mo 27. Aug 2012, 15:43

Re: Datei kopieren Win 7 64bit

Beitrag von Bitschubser »

Weil du spätestens wieder daruaf stoßen wirst, wenn du eine andere "Windows-Funktion" mal brauchst und es keinen Ersatz gibt:
VB_Lazarus hat geschrieben:Warum funktioniert die Windows nicht?


Die funktioniert schon.
Aber: In Lazaraus sind alle "normalen" strings UTF8, Windows benutzt je nach Version irgendeine Kodierung - die nennt Lazarus "Sys".
Die Funtktionen aus "windows" erwarten, dass alle Strings passend für Windows kodiert sind, und liefert die auch entsprechend zurück - konvertieren von/nach UTF8 mußt du dann selber, siehe posting von Mathias.
Wenn du eine (hoffentlich) systemunabhängige Funktion von FileUtil benutzt passiert die Konvertierung in Fileutil (wenn das Betriebssystem nicht selber UTF8 benutzt).

VB_Lazarus
Beiträge: 90
Registriert: Do 23. Dez 2010, 19:10
OS, Lazarus, FPC: Windows 10/11 32/64bit, L 2.2.0 32bit, FPC 3.2.2 32bit
CPU-Target: 32Bit

Re: Datei kopieren Win 7 64bit

Beitrag von VB_Lazarus »

Danke, für die vielen Lösungsvorschläge.

Das mit dem Windows (UTF8ToSys) habe ich versucht.
Hat leider nicht zu dem gewünschten Ergnis geführt.

Ich denke ich versuche die uses Windows einfach herauszunehmen.

Wo finde ich aber die Doku, welche uses welche Funktion anbietet?

Leider muss ich sagen, diese ganze Codierung ist recht aufwendig.

Ich vergesse oft diese anzuwenden (ODBC Datenbank MS Access usw., Filesystem), dann führt es zu Fehlern, welche ich auf anhieb nicht verstehe.

Gruß

Benutzeravatar
theo
Beiträge: 10497
Registriert: Mo 11. Sep 2006, 19:01

Re: Datei kopieren Win 7 64bit

Beitrag von theo »

VB_Lazarus hat geschrieben:Wo finde ich aber die Doku, welche uses welche Funktion anbietet?


Du meinst, welche Unit welche Funktion enthält?

Das Wiki startet hier: http://wiki.lazarus.freepascal.org/

Aber es ist natürlich nicht immer einfach zu wissen, wo man das richtige findet, und was die Unterschiede zwischen ähnlichen Funktionen sind.
Eigentlich hilft da nur Erfahrung und Code Insight (STRG + Leertaste).

Antrepolit
Beiträge: 340
Registriert: Di 12. Sep 2006, 08:57
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit
Kontaktdaten:

Re: Datei kopieren Win 7 64bit

Beitrag von Antrepolit »

Code: Alles auswählen

CopyFileUTF8()
Grüße, Antrepolit

care only if your os is really burning

Benutzeravatar
theo
Beiträge: 10497
Registriert: Mo 11. Sep 2006, 19:01

Re: Datei kopieren Win 7 64bit

Beitrag von theo »

Antrepolit hat geschrieben:

Code: Alles auswählen

CopyFileUTF8()


In welcher Unit ist das und welchen Vorteil soll das haben gegenüber FileUtil.CopyFile ?

VB_Lazarus
Beiträge: 90
Registriert: Do 23. Dez 2010, 19:10
OS, Lazarus, FPC: Windows 10/11 32/64bit, L 2.2.0 32bit, FPC 3.2.2 32bit
CPU-Target: 32Bit

Re: Datei kopieren Win 7 64bit

Beitrag von VB_Lazarus »

Leider hatte ich mich am Anfang etwas undeutlich ausgedrückt.
Ich meinte eine Datei kopieren und während dem kopieren einen anderen Namen vergeben.

Gibt es eigentlich eine Auflistung von units, welche nicht OS spezifisch sind?

Benutzeravatar
theo
Beiträge: 10497
Registriert: Mo 11. Sep 2006, 19:01

Re: Datei kopieren Win 7 64bit

Beitrag von theo »

VB_Lazarus hat geschrieben:Leider hatte ich mich am Anfang etwas undeutlich ausgedrückt.
Ich meinte eine Datei kopieren und während dem kopieren einen anderen Namen vergeben.

:?:
Was feht dir da bei fileutil.CopyFile?
http://wiki.lazarus.freepascal.org/CopyFile

VB_Lazarus
Beiträge: 90
Registriert: Do 23. Dez 2010, 19:10
OS, Lazarus, FPC: Windows 10/11 32/64bit, L 2.2.0 32bit, FPC 3.2.2 32bit
CPU-Target: 32Bit

Re: Datei kopieren Win 7 64bit

Beitrag von VB_Lazarus »

Um ehrlich zu sein theo, hast du mich mit der Information glücklich gemacht.
Es funktioniert tadellos.

Benutzeravatar
theo
Beiträge: 10497
Registriert: Mo 11. Sep 2006, 19:01

Re: Datei kopieren Win 7 64bit

Beitrag von theo »

Mir scheint du weisst nicht recht, wie man sich im Code orientiert?
Lies mal hier: http://wiki.freepascal.org/Lazarus_IDE_Tools/de

Antworten