Entwickler-Ecke
Dateizugriff - Inkompatible Typen: String und PChar
gone - Mo 18.10.04 19:59
Titel: Inkompatible Typen: String und PChar
Hallo,
ich habe folgenden Quellcode um an den Namen einer Datei noch das Datum und die Uhrzeit anzufügen:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19:
| procedure TZeit.ExtraBackup(); var datum,uhrzeit : string; begin datum := FormatDateTime('dd:mm:yyyy',date); uhrzeit := FormatDateTime('hh:nn',time); try if Not DirectoryExists('Sicherungen') then MkDir('Sicherungen'); except Showmessage('Der Sicherungsordner konnte nicht erstellt werden!'); end; try CopyFile('Memofeld1.txt', 'Sicherungen\' + datum + '-' + uhrzeit + '-' + 'Memofeld1.txt', False); except Showmessage('Die Memotextdateien konnten nicht kopiert werden!'); end; end; |
Wieso bekomme ich da die Fehlermeldung?
Vielen Dank,
gone
Brueggendiek - Mo 18.10.04 20:08
Titel: Re: Inkompatible Typen: String und PChar
Hallo Gone!
Die Fehlermeldung bei CopyFile kommt, weil das eine Windows-Systemfunktion ist.
Windows kennt keine Strings wie Delphi und deshalb muß der String in einen PChar umgewandelt werden.
Schreibe
Delphi-Quelltext
1:
| CopyFile('Memofeld1.txt', PChar ('Sicherungen\' + datum + '-' + uhrzeit + '-' + 'Memofeld1.txt'), False); |
und der Fehler sollte weg sein.
Bei String-Literalen (also die mit ' einschlossenen Zeichenfolgen) wandelt Delphi das automatisch um. Dein Ziel ist aber ein zusammengesetzter Ausdruck.
Ach ja - bevor weitere Fragen kommen:
Es ist sehr mutig, die Originaldatei ohne Pfadangabe zu schreiben. Wenn irgendein Programm das aktive Directory ändert, kopierst Du alles, nur nicht die gewünschte Datei!
Auch das Ziel der Kopie ist nicht von vornherein festgelegt, da der Pfad relativ zum aktiven Dir ist!
Gruß
Dietmar Brüggendiek
gone - Mo 18.10.04 20:19
Erst mal vielen Dank!
Also ich bekomme jetzt keinen Fehler mehr, aber die Datei wird nicht angelegt :(
Kann es was mit dem aktiven Verzeichnis zu tun haben?
Bisher war ich davon ausgegangen, dass die Anwendung, egal was kommt, die Datei immer relativ zur Exe speichert.
Ist dem nicht so? So habe ich jedenfalls den Zusatz von dir verstanden.
Ich bin Anfänger, deswegen kenne ich mich kaum aus!
raziel - Mo 18.10.04 21:27
Ich würd mal auf den ":" tippen, weil der in Dateinamen unter Windows nicht vorkommen darf. ;)
Ersetz das ":" in den Formatfunktionen einfach durch ein "_" oder lass es einfach raus
gone - Mo 18.10.04 21:30
Das war es! Vielen Dank euch allen!
Ihr habt mir echt geholfen.
gone
raziel - Mo 18.10.04 21:36
Bitte :)
Und Du kannst den anderen 6490 Usern helfen, in dem Du das kleine grüne Häkchen

rechts oberhalb deines ersten Postings klickst und den Thread so als "erledigt" markierst ;)
raziel
BenBE - Mo 18.10.04 21:41
Kannst du bitte noch den Thread auf erledigt setzen? Dazu gibt's bei deinem ersten Posting ein grünes Häkchen.
Brueggendiek - Mo 18.10.04 21:50
Hallo gone!
da haben wir ja zwei Probleme!
Erstens: Wenn eine Datei keine Pfadangabe hat, wird sie im aktiven Directory gesucht bzw. angelegt.
Beim Programmstart ist normalerweise das Programmverzeichnis das aktive Dir - aber z.B. ein Open-Dialog verändert das!
Deshalb sollte man immer das Dir vollständig angeben.
Soll das das Programmverzeichnis sein, mußt Du mitverzeichnis:=ExtractFilePath (Paramstr(0));den Wert extrahieren.
Allerdings halte ich es nicht für sehr sinnvoll, die Daten immer im Programmverzeichnis zu speichern!
Unter DOS (also Win95, Win98 und WinME) ist das problemlos, aber unter Windows (WinNT, Win2000, WinXP) geht das normalerweise nur mit Administratorrechten - oder der Admin muß das Programmverzeichnis zum Schreiben freigeben. Der Virenprogger sagt dann "Danke für die Lücke" und verseucht die EXE!
Einstellungen gehören in den "Dokumente und Einstellungen"-Ordner, Benutzerdaten in den Daten-Ordner - bzw. in entsprechende Unterordner davon. Da hat jeder Benutzer automatisch Schreibrecht - und jeder Benutzer kann seine Daten unabhängig von den anderen Benutzern speichern. Weitere Informationen sind über "SHGetSpecialFolderLocation" und "SHGetSpecialFolderPath" zu finden - neben der Suchfunktion des Forums steht da noch das MSDN (Microsoft Software Development Network) online und das PDSK (Platform Software Development Kit) zum Download (sind aber über 300 MByte und läuft nur unter NT/2000/XP!) zur Verfügung.
Zweitens: Schau Dir doch mal Deine Dateinamen an! Vielleicht enthalten die ja mit ':' ungültige Zeichen!
Noch ein Hinweis: Wenn ich etwas unter Datums-Dateinamen speichere, dann verwende ich für die Darstellung das ISO-Format 'jjjj-mm-tt' - dann kann ich die Dateinamen ordentlich sortieren und erhalte nicht erst alle 1. Januar, dann alle 1. Februar etc.!
Gruß
Dietmar Brüggendiek
gone - Mo 18.10.04 22:20
@ Brueggendiek:
Vielen Dank für deine ausführliche Antwort.
Ich lasse jetzt beim Start des Programmes den Pfad zum Programm in einer Variablen speichern und das funktioniert auch überall.
Das Programm wird nur von mir selber eingesetzt und ich möchte gerne alles beisammen haben, also lasse ich die Dateien im Programmverzeichnis.
Sollte ich mal ein öffentliches Programm schreiben, werde ich mich aber daran halten und es im Userverzeichnis ablegen!
@ all:
Ich hab schon nach einem Erledigtknopf gesucht, ihn aber bis eben nicht gefunden. In anderen Foren ist er immer am Ende unten links..
Ich werde natürlich gleich draufdrücken!
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!