AGB  ·  Datenschutz  ·  Impressum  







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

AssignFile und WideString Dateiname

Ein Thema von martinf16 · begonnen am 19. Nov 2009 · letzter Beitrag vom 19. Nov 2009
Antwort Antwort
Seite 1 von 2  1 2      
martinf16

Registriert seit: 26. Aug 2007
99 Beiträge
 
Turbo Delphi für Win32
 
#1

AssignFile und WideString Dateiname

  Alt 19. Nov 2009, 03:05
Hallo,
ich wollte einen Code zum Öffnen einer Datei auf WideStrings umstellen. Der wichtigste Ausschnitt des Codes ist folgender:

Delphi-Quellcode:
var
  FileName: WideString;
  F: File;
begin
  {...}
  AssignFile(F, FileName);
  Reset(F, 1);
  BlockRead(....
  {...}
end;
Der Code funktioniert super bis zu dem Moment wo andere als ANSI-Zeichen im FileName vorkommen. Offenbar kann AssignFile nicht mit diesen Zeichen umgehen?! Wie kann ich das nun aber lösen?
Ich habe mich bereits überall umgesehen, den einzigen Lösungsansatz, den ich bisher fand, war den Dateinamen in seinen kurzen Dateinamen (8.3) umzuwandeln, der kein Unicode enthalten soll. Diese Lösung finde ich aber nicht sehr elegant, das muss doch einfacher gehen. Also sowas wie WideAssignFile oder ähnliches. In den TNT's habe ich mich auch schon umgeschaut aber auch nichts gefunden.
Vielen Dank schonmal!
  Mit Zitat antworten Zitat
Benutzerbild von sx2008
sx2008

Registriert seit: 16. Feb 2008
Ort: Baden-Württemberg
2.332 Beiträge
 
Delphi 2007 Professional
 
#2

Re: AssignFile und WideString Dateiname

  Alt 19. Nov 2009, 03:39
Bitte gib' doch deine Delphi Version an (im Profil); ist wichtig für die Beurteilung der Frage.
Der Datentyp "File" ist übrigens völlig veraltet, man sollte stattdessen Streams benützen.
Wenn du kein Delphi 2009 oder neuer hast, dann fehlt dir die Unicode Unterstützung und
TFileStream.Create() nimmt nur einen normalen Ansi-String entgegen.

Trotzdem muss man dann noch nicht aufgeben, denn man kann sich mit der Windows-API
Funktion CreateFileW() ein Handle erzeugen und dieses Handle einem THandleStream Objekt übergeben.

Da man der Funktion CreateFileW() sehr viele Parameter übergeben muss, ist es empfehlenswert,
sich eine Klasse von THandleStream abzuleiten (Namensvorschlag TFileStreamW).
fork me on Github
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#3

Re: AssignFile und WideString Dateiname

  Alt 19. Nov 2009, 10:23
Zitat von sx2008:
...Der Datentyp "File" ist übrigens völlig veraltet, man sollte stattdessen Streams benützen....
Auch wenn ich pers. in der Zwischenzeit Streams nutze (sind meist genauso schnell wie "files") würde mich trotzdem interessieren was an File veraltet sein soll.

Nur weil es "File" schon zu seligen Pascalzeiten gab und er somit relativ alt ist, ist er noch längst nicht veraltet. Daß er mit WideStrings als Dateinamen nicht umgehen kann, würde ich nicht als veraltet, sondern als inkompatibel oder "unfähig" bezeichnen. Aber die grundsätzliche Funktionalität ist heute immer noch gewährleistet.
(Den wahrhaftig mickkrigen Puffer bei Textfile lassen wir einmal aussen vor).

Gruß
K-H
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

Re: AssignFile und WideString Dateiname

  Alt 19. Nov 2009, 10:34
Vorallem das "File" einen internen Puffer verwendet, wobei Windows schon einen einsetzt (die WindowsFileCache) und was am Schlimmsten ist, daß dieser Puffer auch noch mit seinen 128 Byte völlig "schwachsinnig" dimensioniert ist.

Ansonsten ist es einfach nicht so schön OOP.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
gammatester

Registriert seit: 6. Dez 2005
999 Beiträge
 
#5

Re: AssignFile und WideString Dateiname

  Alt 19. Nov 2009, 11:38
Zitat von himitsu:
Vorallem das "File" einen internen Puffer verwendet, wobei Windows schon einen einsetzt (die WindowsFileCache) und was am Schlimmsten ist, daß dieser Puffer auch noch mit seinen 128 Byte völlig "schwachsinnig" dimensioniert ist.

Ansonsten ist es einfach nicht so schön OOP. :stupid:
Was für einen "internen Puffer" meinst Du? Ich sehe keinen in der Definition.
Delphi-Quellcode:
type
{ Typed-file and untyped-file record }

  TFileRec = packed record (* must match the size the compiler generates: 592 bytes *)
    Handle: Integer;
    Mode: Word;
    Flags: Word;
    case Byte of
      0: (RecSize: Cardinal); // files of record
      1: (BufSize: Cardinal; // text files
          BufPos: Cardinal;
          BufEnd: Cardinal;
          BufPtr: PAnsiChar;
          OpenFunc: Pointer;
          InOutFunc: Pointer;
          FlushFunc: Pointer;
          CloseFunc: Pointer;
          UserData: array[1..32] of Byte;
          {$IFNDEF UNICODE}
          Name: array[0..259] of AnsiChar;
          {$ELSE}
          Name: array[0..259] of WideChar;
          {$ENDIF}
      );
  end;
Aber vielleicht meinst Du ja gar nicht file sondern text, das mit read/ln, write/ln bearbeitet wird. Aber da kannst Du, wenn Du 128 Bytes als schwachsinning ansiehst, die Größe mit SetTextBuf ändern.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

Re: AssignFile und WideString Dateiname

  Alt 19. Nov 2009, 11:55
wo? > .BufPtr

Abgesehn davon kann AssignFile ab D2009 zwar Unicode-Dateinamen,
aber Write/WriteLn machen aus den ihnen übergebenen UnicodeString nette Ansi-Strings.


Ich sagte nicht, daß AssignFile und Co. extrem schlecht sind ... für kleine Dinge nutze selbst ich ieses manchmal, aber bei größeren Dateien machen sich die "neueren" OOP-Funktionen/Klassen schon besser.

Und im Normalfall braucht man programmintern eigentlich keinen Puffer, da der ja standardmäßig schon seitens Windows vorhanden ist.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
martinf16

Registriert seit: 26. Aug 2007
99 Beiträge
 
Turbo Delphi für Win32
 
#7

Re: AssignFile und WideString Dateiname

  Alt 19. Nov 2009, 12:43
Okay, ich habe mein Profil aktualisiert. Ich nutze den Turbo Explorer.
Ich habe für die Unicode Unterstützung bislang die TNT Komponenten genutzt und natürlich diverse angepasserte Codes aus dem Internet.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

Re: AssignFile und WideString Dateiname

  Alt 19. Nov 2009, 12:55
In den TNTs sollte eine TWideStringList und ein TWideFileStream vorhanden sein,
genau wegen der fehlenden Unicodeunterstützung seitens deines Delphis gibt es diese Klassen.

AssignFile ist nunmal nativ nur ANSI.

Du müßtest dir also einen neuen Unicopde-FileRec erstellen, ein eigenes AssignFile, welches den UnicodeNamen entgegennimmt und alle (nötigen) Datei-Öffnen-Prozedure, wie Reset, Rewrite und Append, denn erst darin wird die Datei wirklich geöffnet.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
gammatester

Registriert seit: 6. Dez 2005
999 Beiträge
 
#9

Re: AssignFile und WideString Dateiname

  Alt 19. Nov 2009, 13:40
Zitat von himitsu:
wo? > .BufPtr
Wie man leicht sieht, gilt das nur für Textfiles und nicht für file bzw. file of <type>.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

Re: AssignFile und WideString Dateiname

  Alt 19. Nov 2009, 13:48
Stimmt, grad nochmal nachgesehn ... mir war aber so, als hätte ich dort auch mal 'nen Puffer gesehn

Aber mal anderstum: Was spricht gegen die neuen OOP-Varianten?
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 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 09:02 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