AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi RenameFile schlägt fehl - falscher Parameter
Thema durchsuchen
Ansicht
Themen-Optionen

RenameFile schlägt fehl - falscher Parameter

Ein Thema von FBrust · begonnen am 5. Feb 2011 · letzter Beitrag vom 5. Feb 2011
Antwort Antwort
Benutzerbild von FBrust
FBrust

Registriert seit: 4. Okt 2002
Ort: Saarbrücken
654 Beiträge
 
Delphi 10.4 Sydney
 
#1

RenameFile schlägt fehl - falscher Parameter

  Alt 5. Feb 2011, 18:54
Delphi-Version: 2010
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
"Ich habe Dinge gesehen, die ihr Menschen niemals glauben würdet. Gigantische Schiffe, die brannten, draußen vor der Schulter des Orion" - Roy Batty
  Mit Zitat antworten Zitat
zeras

Registriert seit: 11. Mär 2007
Ort: Saalkreis
1.633 Beiträge
 
Delphi 12 Athens
 
#2

AW: RenameFile schlägt fehl - falscher Parameter

  Alt 5. Feb 2011, 18:59
Prüfe doch vorher ab, ob die Quelldatei existiert.
Matthias
Es ist nie falsch das Richtige zu tun!
- Mark Twain
  Mit Zitat antworten Zitat
Benutzerbild von FBrust
FBrust

Registriert seit: 4. Okt 2002
Ort: Saarbrücken
654 Beiträge
 
Delphi 10.4 Sydney
 
#3

AW: RenameFile schlägt fehl - falscher Parameter

  Alt 5. Feb 2011, 19:03
Hab ich (mit "if Fileexists(..."), Datei existiert
"Ich habe Dinge gesehen, die ihr Menschen niemals glauben würdet. Gigantische Schiffe, die brannten, draußen vor der Schulter des Orion" - Roy Batty
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.858 Beiträge
 
Delphi 11 Alexandria
 
#4

AW: RenameFile schlägt fehl - falscher Parameter

  Alt 5. Feb 2011, 19:04
Sind die nötigen Rechte auf das Verzeichnis/die Datei vorhanden?
Markus Kinzler
  Mit Zitat antworten Zitat
Benutzerbild von Assarbad
Assarbad

Registriert seit: 8. Okt 2010
Ort: Frankfurt am Main
1.234 Beiträge
 
#5

AW: RenameFile schlägt fehl - falscher Parameter

  Alt 5. Feb 2011, 19:34
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.

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.
Oliver
"... aber vertrauen Sie uns, die Physik stimmt." (Prof. Harald Lesch)

Geändert von Assarbad ( 5. Feb 2011 um 19:36 Uhr)
  Mit Zitat antworten Zitat
Bernerbaer
(Gast)

n/a Beiträge
 
#6

AW: RenameFile schlägt fehl - falscher Parameter

  Alt 5. Feb 2011, 19:36
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.:

strNewfile:=ExtractFilePath(strOldFile) + '01-Voyager of the future.mp3';
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.049 Beiträge
 
Delphi 12 Athens
 
#7

AW: RenameFile schlägt fehl - falscher Parameter

  Alt 5. Feb 2011, 20:03
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.

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;
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.

Geändert von himitsu ( 5. Feb 2011 um 20:10 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von FBrust
FBrust

Registriert seit: 4. Okt 2002
Ort: Saarbrücken
654 Beiträge
 
Delphi 10.4 Sydney
 
#8

AW: RenameFile schlägt fehl - falscher Parameter

  Alt 5. Feb 2011, 21:06
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

@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

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

Frank
"Ich habe Dinge gesehen, die ihr Menschen niemals glauben würdet. Gigantische Schiffe, die brannten, draußen vor der Schulter des Orion" - Roy Batty
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#9

AW: RenameFile schlägt fehl - falscher Parameter

  Alt 5. Feb 2011, 21:09
Jupp. Bei Datei-Stream wird das Handle auf die Datei mit dem Aufruf von Free geschlossen.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:26 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