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 user profile iconNarses: 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!

user profile iconD. Annies hat folgendes geschrieben Zum zitierten Posting springen:
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.

user profile iconD. Annies hat folgendes geschrieben Zum zitierten Posting springen:
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

user profile iconplatzwart hat folgendes geschrieben Zum zitierten Posting springen:
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

user profile iconHobby-Programmierer hat folgendes geschrieben Zum zitierten Posting springen:
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

user profile iconD. Annies hat folgendes geschrieben Zum zitierten Posting springen:
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

user profile iconDeddyH hat folgendes geschrieben Zum zitierten Posting springen:
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;                 // z.B. schueler.dbf oder SchuelerA.dbf
  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