Delphi-PRAXiS
Seite 2 von 2     12   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Betriebssysteme (https://www.delphipraxis.net/27-betriebssysteme/)
-   -   Kurze Dateinamen anlegen (https://www.delphipraxis.net/90476-kurze-dateinamen-anlegen.html)

himitsu 15. Jan 2009 14:03

Re: Kurze Dateinamen anlegen
 
hast du in deinem Delphi die Delphi-Sourcecodes?
wenn, dann schau mal in die Windows-Unit (Windows.pas), da sind viele Funktionen der WinAPI enthalten. (so um angucken, wie es aussieht)

Zitat:

Zitat von MSDN
Code:
BOOL WINAPI SetFileShortName(
  __in HANDLE hFile,
  __in LPCTSTR lpShortName
);
Requirements:
Kernel32.dll

Delphi-Quellcode:
Function SetFileShortName(hFile: THandle; lpShortName: PChar): LongBool; StdCall;
  External 'kernel32.dll' Name 'SetFileShortName';

// oder, da der Name in delphi nicht geändert wurde

Function SetFileShortName(hFile: THandle; lpShortName: PChar): LongBool; StdCall;
  External 'kernel32.dll';
[add]
es könnte auch so heißen ... falls es für diese Funktion auch 'ne UnicodeVersion gibt.
Delphi-Quellcode:
Function SetFileShortName(hFile: THandle; lpShortName: PAnsiChar): LongBool; StdCall;
  External 'kernel32.dll' Name 'SetFileShortNameA';

Delphi-Laie 15. Jan 2009 15:32

Re: Kurze Dateinamen anlegen
 
Vielen Dank, das hilft mir schon sehr viel weiter.

Später, nachdem ich oben schon geschrieben hatte und wieder ausgeloggt war, fiel mir ein, daß man mit irgendeiner Direktive (stdcall und/oder external o.ä.?) Delphi vielleicht beibringen könnte, das als externe Funktion aufzufassen und dementsprechend (aus welcher Quelle?) aufzurufen. Mit Deiner Mühe werde ich es aber, so hoffe ich, nunmehr umsetzen können.

himitsu 15. Jan 2009 15:35

Re: Kurze Dateinamen anlegen
 
Delphi-Referenz durchsuchenexternal sagt dem Compiler, das es von extern und aus welcher DLL geladen werden soll

Delphi-Referenz durchsuchenStdCall gibt die Aufrufkonvention an (Bedeutung siehe OH)
und warum StdCall, da vieles in der WinAPI nach C-Standard aufgerufen werden muß

Delphi-Laie 15. Jan 2009 16:19

Re: Kurze Dateinamen anlegen
 
Ja, die lieben Aufrufkonventionen, von denen ich auch schon gelesen hatte und mir merken konnte, daß StdCall die häufigste (Standard-?)Form davon ist.

Vielen Dank noch einmal für Deine Mühe!

Also, nach einigem Gewurstel dieses ernüchternde Ergebnis: Für "SetFileShortName" wird der Prozedureinsprungspunkt in der DLL nicht gefunden - Ursache unbekannt. "SetFileShortNameA" und "SetFileShortNameW" werden hingegen wohl gefunden (eine gegensätzliche Meckerei unterbleibt zumindest), führen allerdings nicht zu einem erfolgreichen Aufruf (konkreter: Schreibergebnis) derselben, Ursache natürlich ebenso unbekannt.

Also belasse ich es dabei. Sooo wichtig ist mir das nicht. Mein erwähntes Programm war ein Studien- und Lernprojekt, und die in meinen Augen wichtigen Dateiattribute lassen sich damit editieren, was mir ausreicht.

himitsu 15. Jan 2009 16:32

Re: Kurze Dateinamen anlegen
 
nja, ich hätt eher keine extra Ansi- und Unicode-Vaianten erwartet, da die kurzen Dateienamen nie Unicode sind :shock: , aber egal.

bezüglich Fehler: nach Ausführen von SetFileShortName und Funktionsergebinis (Result) = False mal mit GetLastError die Fehlernummer abfragen.

PS: am Häufigsten / Standard
C = StdCall
Delphi = Register

Delphi-Laie 15. Jan 2009 17:09

Re: Kurze Dateinamen anlegen
 
OK, weil Du mir bisher so nett geholfen hast, die XP-Maschine noch einmal angeworfen....

Nun, daß Umlaute in kurzen Dateinamen nichts zu suchen haben, hatte ich mit meiner nunmehr fast 20jährigen Computererfahrung auch längst bemerkt. Deshalb nehme ich zur Sicherheit die Ansi-Variante dieser Funktionen.

Also, Getlasterror liefert die leider kryptischen 1447 zurück. Werde ich wohl mal suchen, was das bedeuten könnte.

Inzwischen bin ich ein wenig schlauer geworden: Die Datei muß vorher geöffnet werden (ja, in solche Fallen tappt ein Laie, der nur gelegentlich programmiert), und zwar schreibt MS: "The file must be opened with either the GENERIC_ALL access right or GENERIC_WRITE|DELETE, and with the FILE_FLAG_BACKUP_SEMANTICS file attribute."

Mit dem letzten Dateiattribut kann ich allerdings nichts anfangen. Ich kenne es nicht (im Verlaufe der Programmierung hatte ich wohl alle "gängigen" Attribute kennengelernt). So sieht es zur Zeit aus:

Delphi-Quellcode:
var lokalhandle:THandle;

begin

lokalhandle:=FileOpen(Objektname,GENERIC_ALL {and File_Flag_Backup_Semantic});

SetFileShortNameA(Lokalhandle,cAlternateFileName)

himitsu 15. Jan 2009 17:19

Re: Kurze Dateinamen anlegen
 
laß mal dieses (ur)alte MSDN-Library durchsuchenFileOpen weg und verwende MSDN-Library durchsuchenCreateFile.

Bei dwFlagsAndAttributes kannst du dann das Flag FILE_FLAG_BACKUP_SEMANTICS mit angeben.

Delphi-Laie 15. Jan 2009 18:23

Re: Kurze Dateinamen anlegen
 
Also, Deine Geduld ehrt Dich, tausend Dank!

Und ohne ein solches Forum ist man natürlich chancenlos. Woher sollte ein Normalsterblicher überhaupt von der CreateFile-Funktion erfahren, die vom Namen her zum Editieren eines Namens einer schon existenten Datei offensichtlich nicht selbsterklärend genug ist?! Egal.

Jedoch bin ich nach wie vor erfolglos. Die m.E. wichtigsten Zeilen meiner Schreibprozedur (liest den editierbaren, zu ändernden kurzen Dateinamen aus Edit2 aus):

Delphi-Quellcode:
var Lokalhandle:THandle;

begin
Lokalhandle:=createFile(
PChar(Objektname),
GENERIC_All,
File_share_Write,
nil,
Open_Existing,
File_Attribute_Normal and File_Flag_BackUp_Semantics,
0);

SetFileShortNameA(Lokalhandle,PChar(Edit2.Text))

showmessage(inttostr(Getlasterror));
Natürlich habe ich schon einiges an Aufrufvarianten probiert.... Wie schon angedeutet, ich beiße mich nicht daran fest.

Delphi-Laie 15. Jan 2009 18:24

Re: Kurze Dateinamen anlegen
 
Bitte löschen, doppelter Beitrag.

himitsu 24. Jan 2009 19:03

Re: Kurze Dateinamen anlegen
 
Delphi-Quellcode:
Function SetFileShortNameA(hFile: THandle; ShortName: PAnsiChar): LongBool; StdCall;
  External 'kernel32.dll' Name 'SetFileShortNameA';

Var H: THandle;
  D: WIN32_FIND_DATAa;

Begin
  H := FindFirstFileA('Neu Textdokument.txt', D);
  If H = INVALID_HANDLE_VALUE Then Exit;
  Inc(D.cAlternateFileName[7]); // NEUTEX~1.TXT > NEUTEX~2.TXT
  Windows.FindClose(H);

  H := CreateFileA(D.cFileName, GENERIC_All, FILE_SHARE_WRITE, nil,
    OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, 0);
  If H = INVALID_HANDLE_VALUE Then Exit;
  If not SetFileShortNameA(H, @D.cAlternateFileName) Then
    ShowMessage(SysErrorMessage(GetLastError));
  CloseHandle(H);
End;
FILE_ATTRIBUTE_NORMAL wird nur verwendet (muß es aber nicht ... einfach nur 0 geht auch), wenn sonst kein anderes Attribut gesetzt ist.
Und dann werden Attribute (Bits) per OR verknüpft.


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:13 Uhr.
Seite 2 von 2     12   

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