![]() |
Re: : Fehler beim Umbenennen der Datei
nja, das einzige Prolem ist also nur, daß du die Dateien schon im ANSI-Mode ausließt und dort alle nicht kompatieblen Unicode-Zeichen durch '?' ersetzt wurden ... an dieser Stelle schon die UnicodeZeichen zerstört sind und es ist nicht möglich dieses wieder in einen UnicodeString zurückzuwandeln ... wie soll denn irgendjemand/irgendwas nur aus einem '?' wieder das ursprüngliche Zeichen rausbekommen? :zwinker:
Also entweder mußt die immer mit dem Unicodenamen arbeiten, also diesen als Unicode auslesen und auch beim zum Umbennenen der Datei die Unicode-APIs verwenden. alternativ kannst du auch die 8.3-DOS-Dateinamen verwenden, welche jede Datei besitzt. Hierbei muß der Zielname aber auch als ANSI vorliegen, was du ja eh willst :angel2:
Delphi-Quellcode:
DeinRecord.NeuerDateiname könntest du dann noch nach wünschen ändern
type
PDateiRec = ^TDateiRec; TDateiRec = packed record _DateiName : TFileName; _FileName : TFileName; _Erw0 : TFileName; _Erw1 : TFileName; _Pfad : TFileName; _Time : TDateTime; _Attr : integer; _Size : integer; _CRC64Calc : int64; end; if FindFirst(APfad + AMaske, faAnyFile and not faDirectory, sr) = 0 then begin repeat if (sr.Attr and faDirectory) = 0 then begin // aktueller Dateiname in 8.3-Version DeinRecord.Dateiname := sr.FindData.cAlternateFileName; // Dateiname in ANSI DeinRecord.NeuerDateiname := sr.Name; // '?' durch '_' oder Anderes ersetzen for i := 1 to Length(DeinRecord.NeuerDateiname) do if DeinRecord.NeuerDateiname[i] = '?' then DeinRecord.NeuerDateiname[i] := '_'; DeinRecord._Erw0 := _ExtractFileExtOhnePunkt(DeinRecord.NeuerDateiname); DeinRecord._Erw1 := ExtractFileExt(DeinRecord.NeuerDateiname); DeinRecord._FileName := ChangeFileExt(DeinRecord.NeuerDateiname,''); DeinRecord._Pfad := APfad; DeinRecord._Time := _DosDateTimeToDateTime(sr.Time); DeinRecord._Attr := sr.Attr; DeinRecord._Size := sr.Size; end; until FindNext(sr) <> 0; FindClose(sr); end; und zum umbennen dann z.B.
Delphi-Quellcode:
pFrom := DeinRecord.Dateiname;
pTo := DeinRecord.NeuerDateiname; |
Re: : Fehler beim Umbenennen der Datei
Ich habe jetzt alles durch! Auch deine Hilfe himitsu!
Das Ding lässt sich nicht mal als Zipp-Packen - dann hätte ich es schon hochgeladen. Expoler von W-Doof kann sie umbennen, ergo muß es eine Möglichkeit geben. Auch sowas geht nicht, auch als Dos-Name nicht.
Code:
Den "Scheiß" Datei-Namen kann ich kan ich zwar lesen aber nicht ändern. Das ist zum :wall:
//function Rename_Pas(FromFile:WideString;ToFile:string):boolean;
function Rename_Pas(FromFile:string;ToFile:string):boolean; var F : file; begin AssignFile(F,FromFile); try {$I-} Rename(F,ToFile); {$I+} result := boolean(ioResult); finally CloseFile(F); end; end; Wenn einer noch was weiß :coder: |
Re: : Fehler beim Umbenennen der Datei
So geht es endlich
Code:
unit Unit1;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TChOfSet = set of char; TMain = class(TForm) Button1: TButton; procedure Button1Click(Sender: TObject); private procedure GetFiles(APfad,AMaske:string); public { Public-Deklarationen } end; var Main: TMain; implementation uses UnicodeFileUtils; {$R *.dfm} const cUnicodeStr = ['?']; function _StringToWideString(const S: AnsiString): WideString; var X : integer; CodePage : word; begin CodePage := CP_ACP; if S = '' then Result := '' else begin X := MultiByteToWideChar(codePage, MB_PRECOMPOSED, PChar(@S[1]), - 1, nil, 0); SetLength(result, X - 1); if X > 1 then MultiByteToWideChar(CodePage, MB_PRECOMPOSED, PChar(@S[1]),- 1, PWideChar(@Result[1]), X - 1); end; end; //------------------------------------------------------------------------------ function _UniCodeErkennen(var Value: string;Ch :TChOfSet):boolean; var I: integer; begin Result := false; for I:=1 to length(Value) do if Value[I] in Ch then begin Value[I] := '_'; Result := true; end; end; //----------------------------------------------------------------------------- procedure TMain.GetFiles(APfad,AMaske:string); var HFind : THandle; Directory : string; ToFile : string; SRW : WIN32_FIND_DATAW; begin Directory:= ExtractFilePath(APfad); try HFind:=FindFirstFileW(PWideChar(_StringToWideString(APfad+AMaske)),SRW); if HFind<>INVALID_HANDLE_VALUE then begin repeat if SRW.dwFileAttributes and faDirectory <> faDirectory then begin ToFile := SRW.cFileName; if _UniCodeErkennen(ToFile,cUnicodeStr) then begin ToFile :=APfad+ToFile; if MoveFileA(PChar(APfad+SRW.cAlternateFileName), PChar(ToFile)) then; end; begin end; end; until FindNextFileW(HFind,SRW) <> true; end; except end; end; //------------------------------------------------------------------------------ procedure TMain.Button1Click(Sender: TObject); begin GetFiles('C:\Temp\Test\1\','*.*'); end; end. |
Re: : Fehler beim Umbenennen der Datei
Also bei mir Funktioniert es mit ANSI und 8.3-Namen
Delphi-Quellcode:
var APfad, AMaske, ANewName: String;
sr: TSearchRec; begin APfad := 'C:\Temp\Test\1\'; AMaske := 'Delphi 7 *.pdf'; ANewName := 'Delphi 7.pdf'; if FindFirst(APfad + AMaske, faAnyFile and not faDirectory, sr) = 0 then begin if (sr.Attr and faDirectory) = 0 then begin Label1.Caption := Format('%s (%s) > %s', [sr.Name, sr.FindData.cAlternateFileName, ANewName]); If not RenameFile(APfad + sr.FindData.cAlternateFileName, APfad + ANewName) Then Label1.Caption := Label1.Caption + ' = Error'; end; FindClose(sr); end; end; |
Re: : Fehler beim Umbenennen der Datei
Ich habe nochmals deine Antwort überprüft und in der Tat du hast Recht es geht.
Ich habe mich bei der Datei so sehr auf den NAMEN der Datei konzentriert das ich den Pfad vergessen habe, bzw. nicht richtig angegeben habe. Aber das hatte auch einen Vorteil: Ich habe die Befehl (MoveFileA) bzw. (MoveFileW) kennen gelernt oder besser gesagt (Alter Mann) ich habe mich erinnert. Ich denke das MoveFileA sogar schneller ist. Danke für deine Hilfe Mfg |
Re: : Fehler beim Umbenennen der Datei
Zitat:
(Win98 kannte ja sowas wie MoveFileW ursprünglich nicht) MoveFileA wird von Windows auf MoveFileW umgeleitet ... ist also langsamer (aber nur ein winzig kleines Bissl) |
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:22 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz