Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi RenameFile schlägt fehl - falscher Parameter (https://www.delphipraxis.net/158106-renamefile-schlaegt-fehl-falscher-parameter.html)

FBrust 5. Feb 2011 17:54

Delphi-Version: 2010

RenameFile schlägt fehl - falscher Parameter
 
Hallo,

ich versuche gerade eine Datei per RenameFile umzubenennen.

Die Variable strOldFile enthält "D:\Test\01_Voyager_of_the_future.mp3" (ohne die doppelten Anführungszeichen), die Variable strNewFile enthält "01-Voyager of the future.mp3".

Der Code:

Delphi-Quellcode:
      if not Renamefile(strOldFile, strNewFile) then
      begin
        ShowWarning('Fehler bei Umbenennen von ' + #13#10 + strOldfile +
                     #13#10 + 'nach' + #13#10 + strNewFile);
        ShowMessage(SysErrorMessage(GetLastError));
        break;
      end;
Die Quelldatei existiert, die Zieldatei nicht.

Der Fehler, der von SysErrorMessage zurückgegeben wird, lautet: "Falscher Parameter".

Ich dachte zuerst, es würde an den Leerzeichen liegen, aber das Ändern des neuen Dateinamens auf "test0.mp3" brachte die gleiche Fehlermeldung.

Auch spielt es keine Rolle, ob ich bei dem neuen Dateinamen den Pfad mit angebe oder nicht.

Hat vielleicht jemand eine Idee, woran das liegen könnte?

Grüße
Frank

zeras 5. Feb 2011 17:59

AW: RenameFile schlägt fehl - falscher Parameter
 
Prüfe doch vorher ab, ob die Quelldatei existiert.

FBrust 5. Feb 2011 18:03

AW: RenameFile schlägt fehl - falscher Parameter
 
Hab ich (mit "if Fileexists(..."), Datei existiert

mkinzler 5. Feb 2011 18:04

AW: RenameFile schlägt fehl - falscher Parameter
 
Sind die nötigen Rechte auf das Verzeichnis/die Datei vorhanden?

Assarbad 5. Feb 2011 18:34

AW: RenameFile schlägt fehl - falscher Parameter
 
Kleiner Hinweis, den ich auch schon in einem anderen Thema zu Delphi-Referenz durchsuchenRenameFile losgeworden bin: bitte verlaßt euch nicht drauf, wie RenameFile implementiert ist. Es handelt sich nunmal um eine Delphi-Funktion, nicht um eine Win32-Funktion. Entsprechend ist der Aufruf von MSDN-Library durchsuchenGetLastError im besten Fall Glückssache, im schlechtesten Humbug. Wenn schon denn schon: MSDN-Library durchsuchenMoveFile oder MSDN-Library durchsuchenMoveFileEx.

Zitat:

Zitat von FBrust (Beitrag 1079745)
Die Variable strOldFile enthält "D:\Test\01_Voyager_of_the_future.mp3" (ohne die doppelten Anführungszeichen), die Variable strNewFile enthält "01-Voyager of the future.mp3".

[...]

Auch spielt es keine Rolle, ob ich bei dem neuen Dateinamen den Pfad mit angebe oder nicht.

Doch, das spielt normalerweise eine Rolle.

Bernerbaer 5. Feb 2011 18:36

AW: RenameFile schlägt fehl - falscher Parameter
 
Zitat:

die Variable strNewFile enthält "01-Voyager of the future.mp3".
Das halte ich für "gefährlich". Es wird einfach das aktuelle Verzeichnis genommen. Besser: gib den ganzen Pfad an. zb.:

Delphi-Quellcode:
strNewfile:=ExtractFilePath(strOldFile) + '01-Voyager of the future.mp3';

himitsu 5. Feb 2011 19:03

AW: RenameFile schlägt fehl - falscher Parameter
 
Zitat:

Delphi-Quellcode:
if not Renamefile(strOldFile, strNewFile) then
begin
  ShowWarning('Fehler bei Umbenennen von ' + #13#10 + strOldfile +
              #13#10 + 'nach' + #13#10 + strNewFile);
  ShowMessage(SysErrorMessage(GetLastError));
  break;
end;

Was kommt denn für eine Meldung raus, wenn du GetLastError vor den anderen vielen WinAPIs abfragst, welche sich in ShowWarning verstecken?

Delphi-Quellcode:
if not Renamefile(strOldFile, strNewFile) then
begin
  E := GetLastError;
  ShowWarning('Fehler bei Umbenennen von ' + #13#10 + strOldfile +
              #13#10 + 'nach' + #13#10 + strNewFile);
  ShowMessage(SysErrorMessage(E));
  break;
end;
Delphi-Quellcode:
if not Renamefile(strOldFile, strNewFile) then
begin
  S := SysErrorMessage(GetLastError);
  ShowWarning('Fehler bei Umbenennen von ' + #13#10 + strOldfile +
              #13#10 + 'nach' + #13#10 + strNewFile);
  ShowMessage(S);
  break;
end;
oder gleich
Delphi-Quellcode:
if not Renamefile(strOldFile, strNewFile) then
begin
  E := GetLastError;
  //ShowWarning('Fehler bei Umbenennen ' + sLineBreak +
  //            'von ' + strOldfile + sLineBreak + 
  //            'nach' + strNewFile + sLineBreak +
  //            SysErrorMessage(E));
  ShowWarning(Format('Fehler bei Umbenennen '#13#10'von %s'#13#10'nach %s'#13#10'%s',
              [strOldfile, strNewFile, SysErrorMessage(E)]));
  break;
end;
PS: Delphi-Referenz durchsuchenRenameFile ist schon immer eine direkte Umleitung auf MSDN-Library durchsuchenMoveFile, ohne irgendwelchen Schnickschnack, also klappt das mit dem GetLastError danach, aber stimmt schon ... im Sige auf MacOS, Linux und Co. könnte sich daran was ändern. :angle2:

Aber hier macht es eigentlich keinen Sinn, daß Delphi/Embarcadero da noch anderen Code einfügt, da nur eine Konvertierung von String auf PChar nötig ist.
Delphi-Quellcode:
function RenameFile(const OldName, NewName: string): Boolean;
begin
{$IFDEF MSWINDOWS}
  Result := MoveFile(PChar(OldName), PChar(NewName));
{$ENDIF MSWINDOWS}
{$IFDEF POSIX}
  Result := __rename(PAnsiChar(UTF8String(OldName)), PAnsiChar(UTF8String(NewName))) = 0;
{$ENDIF POSIX}
end;

FBrust 5. Feb 2011 20:06

AW: RenameFile schlägt fehl - falscher Parameter
 
Hallo,

ich hab jetzt folgenden Code:

Delphi-Quellcode:
      if not MoveFileEx(PChar(strOldFile), PChar(strNewFile), MOVEFILE_COPY_ALLOWED) then
      begin
        ShowMessage(SysErrorMessage(GetLastError));
        ShowWarning('Fehler bei Umbenennen von ' + #13#10 + strOldfile +
                     #13#10 + 'nach' + #13#10 + strNewFile);
      end;
Dank dem Vorschlag von Himitsu hab ich SysErrorMessage vor die eigentliche Fehlermeldung gestellt und bekam

"Der Prozess kann nicht auf die Datei zugreifen, da die Datei von einem anderen Prozess verwendet wird."

Also im ProcessExplorer nachgeschaut und tatsächlich was gefunden:

<Non-Existent Process> 2440 Handle D:\Test\01_Voyager_of_the_future.mp3

Zwar nicht sehr aussagekräftig, aber da der (das?) Handle nicht gefunden wird, solange mein Programm nicht läuft, war klar, dass es mein eigenes Programm war, das die Datei im Zugriff hält.

Ursache war folgendes;
Die Dateinamen werden (zusammen mit anderen Infos) in ein Grid eingelesen. Ausserdem werden MP3-Infos ausgelesen. Zu diesem Zweck werden in einer Schleife (für alle Dateien...) Streams erzeugt. Dummerweise habe ich zwar fleissig Streams erzeugt, da aber die Freigabe .Free ausserhalb der Schleife lag, wurde nur der zuletzt erzeugte Stream wieder freigegeben, alle anderen (und damit die Dateizugriffe) blieben bestehen :wall:

@Assarbad: Das mit dem "Pfad spielt keine Rolle" war so gemeint, dass der Fehler trotzdem kam, ob mit Pfad oder ohne. Sobald der Zugriff funktioniert, merkt man sehr schnell, wie wichtig die Angabe des Pfads bei der Zieldatei ist :P

Danke, Community, hätte ich ohne euch nicht gefunden :thumb:

Frank

Luckie 5. Feb 2011 20:09

AW: RenameFile schlägt fehl - falscher Parameter
 
Jupp. Bei Datei-Stream wird das Handle auf die Datei mit dem Aufruf von Free geschlossen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:09 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