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 1 von 2  1 2      
Benutzerbild von Opa
Opa

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

: Fehler beim Umbenennen der Datei

  Alt 30. Nov 2007, 10:59
Ich bekomme folgende Meldung aus: Fehler beim Umbenennen der Datei...(... kann nicht umbenannt werden: Die Syntax für den Dateinamen, Verzeichnisnamen oder die Datenträgerbezeichnung ist falsch.
Dieses passiert im ersten Arbeitsschritt zur Dateinamen bereinig (Schritt 1 z.B. PDF in pdf). Erst im zweiten schritt wollte ich auch diesen „Müll“ bereinigen.
Gibt es eine Möglichkeit das „W-Doof“ das erst mal ignoriert (ohne so eine MSG-Box-Meldung) die ist nämlich die stört

Warum ich das bekomme ist mir schon klar, die Datei hat ein paar falsche Zeichen in ihren Namen. (Diese Zeichen hier darzustellen ist nicht möglich).
Code:
  SHFileOpStruct: TSHFileOpStruct;
begin
  Application.ProcessMessages;
  with SHFileOpStruct do
  begin
    Wnd              := Application.Handle;
    wFunc            := Func;
    fFlags           := Flags;
    pFrom            := PChar(_ExBackSlash(FromFile)+#0+#0);
    hNameMappings    := nil;
    lpszProgressTitle := nil;
http://www.sozialhilfe-pragmatik.org...ar/Msg-Box.jpg
Miniaturansicht angehängter Grafiken
msg-box_336.jpg  
  Mit Zitat antworten Zitat
Benutzerbild von mirage228
mirage228

Registriert seit: 23. Mär 2003
Ort: Münster
3.750 Beiträge
 
Delphi 2010 Professional
 
#2

Re: : Fehler beim Umbenennen der Datei

  Alt 30. Nov 2007, 11:15
Du könntest bei den Flags das Flag "NO_ERRORUI" (oder Ähnlich) angeben, dann werden Fehlermeldungen unterdrückt.

mfG
mirage228
David F.

May the source be with you, stranger.
PHP Inspection Unit (Delphi-Unit zum Analysieren von PHP Code)
  Mit Zitat antworten Zitat
Benutzerbild von Opa
Opa

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

Re: : Fehler beim Umbenennen der Datei

  Alt 30. Nov 2007, 11:31
Das werde ich mal probieren, löst aber das Problem nicht ganz, Da der Müll so ein „Scheiß“ Unicode ist: Gibt es eine Möglichkeit in Delphi den direkt umzuwandeln in ANSI.

Das Flag heißt im übrigen : FOF_NOERRORUI

Mfg
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#4

Re: : Fehler beim Umbenennen der Datei

  Alt 30. Nov 2007, 14:30
versuch mal einen einfachen Cast nach Unicode. Zudem erinnere ich mich das wir irgendwo hier schonmal die Lösung hatten. Leider weiß ich nicht wonach man da suchen könnte.

Könntest du das Bild aus dem ersten Beitrag bitte in den Anhang packen damit es auch noch verfügbar ist wenn du es von deinem Webspace gelöscht hast. Ansonsten würde das Bild dann irgendwann fehlen und ein wichtiger Teil des Beitrags wäre verloren.
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Benutzerbild von Opa
Opa

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

Re: : Fehler beim Umbenennen der Datei

  Alt 30. Nov 2007, 19:13
Ich weiß mittlerweile warum ich das nicht umbennen kann
Aus diesen Zeichen werden Direkt im String ???-Zeichen gemacht, damit ist klar das dieser Name nicht zu ändern ist.
Möglicherweise kann man dieses mit WideCharToMultiByte umghen, da gibt es aber ein Problem:
Ich lese die Dateinamen so ein:
Code:
type
SR       : TSearchRec;
...
      if FindFirst(APfad+AMaske,AAttrDatei, SR) = 0 then
      begin
        repeat
          FilesAdd(DateiRecList,Directory,SR);
        until FindNext(SR) <> 0;
...
SR.Name hat dann schon die ???-Zeichen.
Meine Frage ist wie lese ich Datei-Namen unter Umgehung von SR.Name ein und dieses fortlaufend.
Wenn das geht den Datei-Namen evtl. sofort in „lesbare“ Zeichen umzuwandeln und ändern.
Kann ja sein das dazu einer einen Tipp hat.
Mfg
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#6

Re: : Fehler beim Umbenennen der Datei

  Alt 30. Nov 2007, 19:22
Hallo Opa,

damit Unicode-Dateinamen auch als solche in deinem Programm ankommen, musst du wohl auf die Unicode-Versionen der API Funktionen zurückgreifen: FindFirstFileW() und MoveFileW().

Grüße vom marabu
  Mit Zitat antworten Zitat
Benutzerbild von Opa
Opa

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

Re: : Fehler beim Umbenennen der Datei

  Alt 1. Dez 2007, 01:21
Nach dem ich jetzt den ganzen Aufwand betrieben habe um den Dateinamen ggf. korrekt auszulesen kann ich die Datei immer noch nicht (Automatisch), Tolal-Comander und W-Doof selber kann das, umbennen.

Ich kann die nicht mal ohne Umbenennung auf meinen FTP Senden.
Die Datei ist (ist nur aus versehen bei mir gelandet) eine chinesische Anleitung für Delphi 7.
"Mann" muss zwar wegen dieser einen Datei nicht den Aufwand betreiben, es dürfte aber nerven wenn man Seiten (PDF-Datein) aus China bekommt, das man diese erst mit der Hand ändern muss, wenn der Chinese was als Kommentar zusätzlich geschrieben hat.

http://www.sozialhilfe-pragmatik.org...g-Meldung2.jpg

http://www.sozialhilfe-pragmatik.org...-Commander.jpg

Die ???-Zeichen habe ich auch im Wide-Code – nur zum Einlesen des Dateinamen, hat sich das ändern des Prg. nicht gelohnt.

Als Unicode liest sich der Mist so:

http://www.sozialhilfe-pragmatik.org...ar/Unicode.jpg
Mfg
Miniaturansicht angehängter Grafiken
msg-meldung_von_t-commander_180.jpg   msg-meldung2_575.jpg  
  Mit Zitat antworten Zitat
1. Dez 2007, 08:50
Dieses Thema wurde von "Matze" von "Programmieren allgemein" nach "Windows API / MS.NET Framework API" verschoben.
Das schaut sehr nach einer Delphi-Frage aus.
Benutzerbild von himitsu
himitsu

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

Re: : Fehler beim Umbenennen der Datei

  Alt 1. Dez 2007, 21:34
Zitat von Opa:
Nach dem ich jetzt den ganzen Aufwand betrieben habe um den Dateinamen ggf. korrekt auszulesen kann ich die Datei immer noch nicht (Automatisch)...

Die ???-Zeichen habe ich auch im Wide-Code – nur zum Einlesen des Dateinamen, hat sich das ändern des Prg. nicht gelohnt.

Als Unicode liest sich der Mist so:
ja und wie ließt du jetzt die Dateinamen ein, damit sowas rauskommt?
(wenn es richtig eingelesend wird, dann kommt sowas auch nicht raus)
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
 
#10

Re: : Fehler beim Umbenennen der Datei

  Alt 2. Dez 2007, 07:59
Code:
type
  PDateiRec = ^TDateiRec;
  TDateiRec = packed record
    _DateiName : WideString;
    _FileName  : TFileName;
    _Erw0       : TFileName;
    _Erw1       : TFileName;
    _Pfad      : string;
    _Time      : TDateTime;
    _Attr      : integer;
    _Size      : int64;
    _CRC64Calc : int64;
  end;
const
  cUnicodeStr = ['?'];
  C_P        = '.';
  C_PP       = '..';
//------------------------------------------------------------------------------
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 _WideStringToString(const WS: WideString): AnsiString;
var
  X       : integer;
  CodePage : word;
begin
  CodePage := CP_ACP;
  {CP_ACP ANSI code page
  CP_MACCP Macintosh code page
  CP_OEMCP OEM code page}
  if WS = '' then result := ''
  else begin
         X := WideCharToMultiByte(codePage,WC_COMPOSITECHECK or WC_DISCARDNS or WC_SEPCHARS or WC_DEFAULTCHAR,
         @WS[1], - 1, nil, 0, nil, nil);
         SetLength(result, X - 1);
         if X > 1 then WideCharToMultiByte(codePage,
         WC_COMPOSITECHECK or WC_DISCARDNS or WC_SEPCHARS or WC_DEFAULTCHAR,@WS[1], - 1, @result[1], X - 1, nil, nil);
  end;
end; { WideStringToString }
//------------------------------------------------------------------------------
function _ReNameFile(const FromFile,ToFile:string;AHandle:THandle=0):boolean;
begin
  result := _ShellFileOperation(FromFile,ToFile,FO_RENAME,FOF_NOCONFIRMATION or FOF_SILENT);
  if not result and (AHandle <> 0) then SendMessage(AHandle,WM_SYSTEM_DATEI,longInt(@FromFile),14);
end;
//------------------------------------------------------------------------------
{Proceduren/Functionen-Anfang**************************************************}
{Damit können wir also die Dateien "windowsgemäß" löschen, die "fFlags" können folgendes
sein:
- FOF_ALLOWUNDO      = läßt ein Rückgängigmachen, falls möglich zu
- FOF_NOWCONFIRMATION = Löschen ohne Bestätigungsfrage
- FOF_SIMPLEPROGRESS = mit Fortschritts-Dialogbox, allerdings ohne die Dateinamen anzuzeigen
_ FOF_SILENT         = ohne Fortschritts-Dialogbox Mehrere Flags können mit OR kombiniert werden.}
//------------------------------------------------------------------------------
function _ShellFileOperation(const FromFile,ToFile: string; const Func,Flags: integer;AHandle:THandle=0):boolean;
var //uses Forms,ShellAPI
  SHFileOpStruct: TSHFileOpStruct;
begin
  Application.ProcessMessages;
  with SHFileOpStruct do
  begin
    Wnd              := Application.Handle;
    wFunc            := Func;
    fFlags           := Flags;// or FOF_NOERRORUI; //keine Fehlermeldung
    pFrom            := PChar(_ExBackSlash(FromFile)+#0+#0);
    hNameMappings    := nil;
    lpszProgressTitle := nil;
    if ToFile = ''
    then pTo := nil
    else pTo := PChar(ToFile+#0+#0);
//    if ToFile = pFrom then exit;
//    if pFrom ='' then exit;
  end;
  result := SHFileOperation(SHFileOpStruct) = 0;
  if not result then SendMessage(AHandle,WM_SYSTEM_DATEI,longInt(@FromFile),15);
  Application.ProcessMessages;
end;
//------------------------------------------------------------------------------
procedure TDrive.GetFiles(APfad,AMaske:string);
var
  SR       : TSearchRec;
  HFind    : THandle;
  Directory : string;
  SRW      : WIN32_FIND_DATAW;
  X :String;
begin
//  X := 'C:\Temp\Test\*.*';
  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 FilesAdd(DateiRecList,Directory,SRW);
      until FindNextFileW(HFind,SRW) <> true;
    end;
  except
  end;

  if not AMitDir then exit;
  try
    try
      if FindFirst(Directory + '*.*',AAttrDir ,SR) = 0 then
      begin
        repeat
          if ((SR.Attr and faDirectory) = faDirectory) and ((SR.Name[1] <> C_P) and (SR.Name[1] <> C_PP)) then
          begin
            SendMessage(Handle,WM_READ_PFAD,0,DateiRecList.Count);
            GetFiles(Directory+_BackSlash(SR.Name)+ExtractFileName(APfad),AMaske);
          end;
        until FindNext(SR) <> 0;
      end;
    except
    end;
  finally
    SysUtils.FindClose(SR);
  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 TDrive.ClearRec(P:pointer);
begin
  with PDateiRec(P)^ do
  begin
    _DateiName :=#0;
    _FileName  := '';
    _Erw0       := '';
    _Erw1       := '';
    _Pfad      := '';
    _Time      := 0;
    _Attr      := 0;
    _Size      := 0;
    _CRC64Calc := 0;
  end;
end;
//------------------------------------------------------------------------------
procedure TDrive.FilesAdd(TL:TList;Directory:string;SRW : WIN32_FIND_DATAW);
var//uses SysUtils,_Strings;
  P : pointer;
  FromFile : string;
  ToFile  : string;
begin
  with SRW do
  begin
    P := new(PDateiRec);
    with PDateiRec(P)^,SRW do
    begin          //_StringToWideString
      ClearRec(P);
      if dwFileAttributes and faDirectory <> faDirectory then _DateiName := cFileName;
      ToFile    := _WideStringToString(_DateiName);
      _Pfad     := Directory;
      if _UniCodeErkennen(ToFile,cUnicodeStr) then
      begin
        {$I+}
//          Dispose(P);
        {$I-}
//        exit; //Noch keine Lösung für das Problem
        FromFile := _Pfad+_WideStringToString(_DateiName);
        ToFile  := _Pfad+ToFile;
        _ReNameFile(FromFile,ToFile)
      end;
      _FileName := _WideStringToString(_DateiName);
      _Erw0     := _ExtractFileExtOhnePunkt(_FileName);
      _Erw1     := ExtractFileExt(_FileName);
      _FileName := ChangeFileExt(_FileName,'');
      _Pfad    := Directory;
      _Time    := _FileTimeToDateTime(ftCreationTime);//TFileTime
      _Attr    := dwFileAttributes;
      _Size    := nFileSizeHigh shl 32 or nFileSizeLow;
    end;
  end;
  TL.Add(P);
end;
So da haste fast alles (könnte was übersehen haben den ganzen Code-Teil). Da ich bis jetzt noch keine Lösung habe (Du weißt sie vermutlich auch nicht) und da es sich z.Z. nur um eine Datei handelt, ignoriere ich das.

Es ärgert mich allerdings sehr, weil es NICHT RICHTIG IST was zu ignorieren. Bin für jeden Vorschlag dankbar aber ich denke das ich hier (verständlich ist nicht häufig der Fehler), keine Lösung finden werde. Das Problem für mich ist das ich leider kein Englisch/Russisch kann, dann hätte ich vermutlich schon eine Lösung.

Nur als Hintergrund wissen: Soll ein Privates Programm werden das (ich habe viele Hefte und Bücher als PDF) und ich möchte sie, nach meinem Schema verwalten. Und weil jeder seien eigen „Müll“ in die Dateinamen schreibt, ich den nicht will und ich ein bisschen Proggen kann, will ich mir das Problem weitergehend automatisch vom Halse schaffen. (Gut in der Zeit könnte ich die Dateinamen auch mit der Hand ändern. Macht aber nicht soviel Spaß. Und doppelte Dateien zu finden ist auch nicht so einfach (per hand), nicht wenn man mehr als 5.000 Bücher auf den Rechner hat. Ich habe die meisten davon schon gelesen (sogar gekauft) aber das ist eine andere Geschichte,...

Zufrieden? Alle Fragen geklärt?

Mfg
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 05:04 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