Delphi-PRAXiS
Seite 2 von 2     12   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   : Fehler beim Umbenennen der Datei (https://www.delphipraxis.net/104258-fehler-beim-umbenennen-der-datei.html)

himitsu 2. Dez 2007 12:02

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:
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;
DeinRecord.NeuerDateiname könntest du dann noch nach wünschen ändern
und zum umbennen dann z.B.
Delphi-Quellcode:
pFrom := DeinRecord.Dateiname;
pTo  := DeinRecord.NeuerDateiname;

Opa 2. Dez 2007 19:20

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:
//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;
Den "Scheiß" Datei-Namen kann ich kan ich zwar lesen aber nicht ändern. Das ist zum :wall:
Wenn einer noch was weiß :coder:

Opa 3. Dez 2007 12:09

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.

himitsu 3. Dez 2007 12:40

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;

Opa 3. Dez 2007 16:58

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

himitsu 3. Dez 2007 17:27

Re: : Fehler beim Umbenennen der Datei
 
Zitat:

Zitat von Opa
Ich denke das MoveFileA sogar schneller ist.

Zu Win98-Zeiten vielleicht noch.
(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.
Seite 2 von 2     12   

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