Entwickler-Ecke
Delphi Language (Object-Pascal) / CLX - RenameFile-Problem
D. Annies - Fr 04.09.09 13:56
Titel: RenameFile-Problem
Hi, Delpher,
der folgende renamefile-Befehl funzt nicht:
Delphi-Quelltext
1: 2:
| if renamefile(label30.Caption+ 'SchuelerA.dbf', label30.caption+ 'schueold.dbf') then showmessage('Datei wurde in schueold.dbf umbenannt'); |
Wer weiß, warum?
Detlef
Narses - Fr 04.09.09 14:03
Moin!
AFAIR übergibt man als Zieldateinamen (2. Parameter) nur den Namen, ohne Pfad. :idea:
cu
Narses
Delete - Fr 04.09.09 14:05
Fehlende Rechte oder dergleichen? Ich denke, Du bekommst nähere Informationen, wenn Du statt RenameFile MoveFile verwendest. Geht das schief, kannst Du mit GetLastError ermitteln, woran es liegt.
D. Annies - Fr 04.09.09 14:07
Danke, Narses ! :idea: :shock: :idea: !
---
Moderiert von
Narses: Beiträge zusammengefasst---
OOPS! zu früh gefreut!
Ich habe jetzt sogar den ersten Pfad weggenommen, aber es geht immer noch nicht!
Bleibt noch DeddyH's Lösungsvorschlag - fehlende Rechte sind es in meinem Fall nicht.
Melde mich wieder, Detlef
Narses - Fr 04.09.09 14:27
Moin!
D. Annies hat folgendes geschrieben : |
| Ich habe jetzt sogar den ersten Pfad weggenommen, aber es geht immer noch nicht! |
Das ist natürlich unfug, die umzubenennende Datei sollte schon vollqualifiziert sein.
D. Annies hat folgendes geschrieben : |
| OOPS! zu früh gefreut! |
Die Quelldatei darf nicht im (exklusiven) Zugriff sein und die Zieldatei darf nicht bereits vorhanden sein. :nixweiss:
cu
Narses
Nersgatt - Fr 04.09.09 14:42
Im Label30.Caption steht auch das \ mit drin?
D. Annies - Fr 04.09.09 14:47
Hi, Nersgatt, ja der / steht mit drin, aber ich glaube, die Zieldatei gibt's schon.
Dann aber doch den ganzen Pfad?
Detlef
Hobby-Programmierer - Fr 04.09.09 14:55
nicht '/' sondern '\'. Ausserdem solltest du dann auch mit 'FileExists' ob die Datei schon existiert.
platzwart - Fr 04.09.09 14:55
Ehm, wenn die Zieldate bereits existiert, dann muss die erst gelöscht werden...
Hobby-Programmierer - Fr 04.09.09 14:58
platzwart hat folgendes geschrieben : |
| Ehm, wenn die Zieldate bereits existiert, dann muss die erst gelöscht werden... |
.. oder vorher umbenennen :P
Andreas L. - Fr 04.09.09 15:57
Hobby-Programmierer hat folgendes geschrieben : |
| nicht '/' sondern '\'. Ausserdem solltest du dann auch mit 'FileExists' ob die Datei schon existiert. |
Sollte aber mit / genau so klappen. Im Zweifelsfall einfach IncludeTrailingPathDelimiter verwenden ;-)
D. Annies - Sa 05.09.09 06:44
Tschuldigung, na klar '\', habe ich auch so.
So, jetzt habe ich die folgende "Version", die nicht klappt:
Delphi-Quelltext
1: 2: 3: 4: 5: 6:
| if fileexists(label30.Caption+ 'schueold.dbf') then deletefile(label30.Caption+ 'schueold.dbf');
if movefile(PChar(label30.Caption+ 'SchuelerA.dbf'), 'schueold.dbf') then showmessage('Datei wurde in schueold.dbf umbenannt') else showmessage('Datei konnte nicht in schueold.dbf umbenannt werden'); |
Arrgh, Detlef
jaenicke - Sa 05.09.09 07:06
Funktioniert denn an der Stelle im Programm (du kannst ja z.B. ein ShowMessage einbauen zum Anhalten) das Umbenennen bzw. Löschen im Windows Explorer? Ich vermute einmal nicht. Wenn es dort auch nicht geht, ist die Datei in Benutzung wie bereits vorher gesagt wurde. Und dann funktioniert auch das Löschen oder Umbenennen im Programm natürlich nicht.
Jedenfalls müssen soweit ich weiß grundsätzlich bei diesen Funktionen immer die kompletten Pfade angegeben werden und nicht nur der Dateiname. Etwas anderes sehe ich auch nicht in der Dokumentation.
D. Annies - Sa 05.09.09 07:59
Hi, Sebastian, stimmt - das Umbenennen funktioniert auch nicht, aber sieh dir mal den Code an:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12:
| if fileexists(label30.Caption+ 'schueold.dbf') then begin if deletefile(label30.Caption+ 'schueold.dbf') then showmessage(label30.Caption+ 'schueold.dbf wurde gelöscht') else showmessage(label30.Caption+ 'schueold.dbf wurde nicht gelöscht'); end else showmessage(label30.Caption+ 'schueold.dbf existiert nicht');
if movefile(PChar(label30.Caption+ 'SchuelerA.dbf'), PChar(label30.caption+ 'schueold.dbf')) then showmessage('Datei wurde in schueold.dbf umbenannt') else showmessage('Datei konnte nicht in schueold.dbf umbenannt werden'); |
und : schueold.dbf existiert nicht! Also irgendetwas mit movefile?
jaenicke - Sa 05.09.09 09:12
D. Annies hat folgendes geschrieben : |
| Hi, Sebastian, stimmt - das Umbenennen funktioniert auch nicht, aber sieh dir mal den Code an: |
Wenn das Umbenennen im Windows Explorer auch nicht geht, hat das doch rein gar nichts mit dem Code an der Stelle zu tun, sondern damit, dass die Datei (eine Datenbank nehme ich an) gerade geöffnet ist, die Datei also benutzt wird.
Delete - Sa 05.09.09 11:58
DeddyH hat folgendes geschrieben : |
| Geht das schief, kannst Du mit GetLastError ermitteln, woran es liegt. |
Delphi-Quelltext
1: 2:
| if not MoveFile(...) then ShowMessage(SysErrorMessage(GetLastError)); |
D. Annies - Sa 05.09.09 17:39
"Der Prozess kann nicht auf die Datei zugreifen, da die Datei von einem anderen Prozess in Gebrauch ist".
Also genau, wie du gedacht hast!
Ich habe inzwischen [nach einem ausgiebigen Tauchgang in der Ostsee bei Scharbeutz <--offtopic] die Funktion IsFileInUse(fname) gefunden und damit gearbeitet.
Das Problem ist jetzt also wohl, wie ich die Datei "gebrauchlos" mache.
Wie geht das?
Detlef
jaenicke - Sa 05.09.09 17:44
Naja, irgendwo musst du damit ja etwas machen, vermutlich mit einer Datenbankkomponente. :nixweiss:
D. Annies - Sa 05.09.09 19:11
Hi, Sebastian,
nun, ich habe die folgende Proc, sie schließt aber die (vorige) Tabelle.
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9:
| procedure Tform1.lade_schueler(sender:tobject); var n: integer; begin TbSchueler.active := false; TbSchueler.DatabaseName := listbox11.items[listbox11.itemindex]; TbSchueler.TableName := Ss_Tn; TbSchueler.active := true; showmessage('Schülertabelle '+ Ss_Tn+ ' ist geladen'); end; |
Detlef, :?:
Dude566 - Sa 05.09.09 19:20
Wenn ich das jetzt auf die Schnelle richig verstanden habe dann greifst du doch noch auf die Datenbank zu also kannst du sie auch nicht löschen oder umbenennen.
D. Annies - Sa 05.09.09 20:10
Ich habe keine extra Datenbankkomponente an dieser Stelle, sondern nur den Eintrag
TbSchueler.databasename := ... Dort vergebe ich den Alias.
Wie werde ich denn bloß die Verbindung los??
Gruß, Detlef
D. Annies - So 06.09.09 07:29
So, es ist gelöst:
Delphi-Quelltext
1: 2: 3: 4:
| if copyfile(PChar(TbSynctab.tablename), PChar(label30.Caption+'SchuelerA.dbf'), false) then showmessage('Datei '+ TbSynctab.TableName+ ' wurde in SchuelerA.dbf umbenannt') else showmessage('Datei '+ TbSynctab.TableName+ ' konnte nicht in SchuelerA.dbf umbenannt werden'); |
der dritte Parameter von copyfile sorgt dafür, dass die Zieldatei überschriebeb wird, wenn sie existiert. Den Else-Zweig habe ich nur der Vollständigkeit halber hingeschrieben.
Gruß und vielen Dank für eure Hilfestellung,
Detlef
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 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!