AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

: Fehler beim Umbenennen der Datei

Ein Thema von Opa · begonnen am 30. Nov 2007 · letzter Beitrag vom 3. Dez 2007
Antwort Antwort
Seite 2 von 2     12   
Benutzerbild von himitsu
himitsu
Online

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

Re: : Fehler beim Umbenennen der Datei

  Alt 2. Dez 2007, 12:02
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?

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
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;
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Benutzerbild von Opa
Opa

Registriert seit: 12. Jun 2003
107 Beiträge
 
Delphi 7 Enterprise
 
#12

Re: : Fehler beim Umbenennen der Datei

  Alt 2. Dez 2007, 19:20
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
Wenn einer noch was weiß
  Mit Zitat antworten Zitat
Benutzerbild von Opa
Opa

Registriert seit: 12. Jun 2003
107 Beiträge
 
Delphi 7 Enterprise
 
#13

Re: : Fehler beim Umbenennen der Datei

  Alt 3. Dez 2007, 12:09
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.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

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

Re: : Fehler beim Umbenennen der Datei

  Alt 3. Dez 2007, 12:40
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;
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Benutzerbild von Opa
Opa

Registriert seit: 12. Jun 2003
107 Beiträge
 
Delphi 7 Enterprise
 
#15

Re: : Fehler beim Umbenennen der Datei

  Alt 3. Dez 2007, 16:58
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
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

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

Re: : Fehler beim Umbenennen der Datei

  Alt 3. Dez 2007, 17:27
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)
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 2     12   


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 02:16 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