AGB  ·  Datenschutz  ·  Impressum  







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

Kurze Dateinamen anlegen

Ein Thema von xaromz · begonnen am 18. Apr 2007 · letzter Beitrag vom 24. Jan 2009
Antwort Antwort
Seite 2 von 2     12   
Benutzerbild von himitsu
himitsu

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

Re: Kurze Dateinamen anlegen

  Alt 15. Jan 2009, 14:03
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 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.dllName '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.dllName 'SetFileShortNameA';
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Delphi-Laie

Registriert seit: 25. Nov 2005
1.474 Beiträge
 
Delphi 10.1 Berlin Starter
 
#12

Re: Kurze Dateinamen anlegen

  Alt 15. Jan 2009, 15:32
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.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

Re: Kurze Dateinamen anlegen

  Alt 15. Jan 2009, 15:35
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ß
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Delphi-Laie

Registriert seit: 25. Nov 2005
1.474 Beiträge
 
Delphi 10.1 Berlin Starter
 
#14

Re: Kurze Dateinamen anlegen

  Alt 15. Jan 2009, 16:19
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.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

Re: Kurze Dateinamen anlegen

  Alt 15. Jan 2009, 16:32
nja, ich hätt eher keine extra Ansi- und Unicode-Vaianten erwartet, da die kurzen Dateienamen nie Unicode sind , 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
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Delphi-Laie

Registriert seit: 25. Nov 2005
1.474 Beiträge
 
Delphi 10.1 Berlin Starter
 
#16

Re: Kurze Dateinamen anlegen

  Alt 15. Jan 2009, 17:09
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)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

Re: Kurze Dateinamen anlegen

  Alt 15. Jan 2009, 17:19
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.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Delphi-Laie

Registriert seit: 25. Nov 2005
1.474 Beiträge
 
Delphi 10.1 Berlin Starter
 
#18

Re: Kurze Dateinamen anlegen

  Alt 15. Jan 2009, 18:23
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.
  Mit Zitat antworten Zitat
Delphi-Laie

Registriert seit: 25. Nov 2005
1.474 Beiträge
 
Delphi 10.1 Berlin Starter
 
#19

Re: Kurze Dateinamen anlegen

  Alt 15. Jan 2009, 18:24
Bitte löschen, doppelter Beitrag.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

Re: Kurze Dateinamen anlegen

  Alt 24. Jan 2009, 19:03
Delphi-Quellcode:
Function SetFileShortNameA(hFile: THandle; ShortName: PAnsiChar): LongBool; StdCall;
  External 'kernel32.dllName '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.
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 01:09 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