Delphi-PRAXiS

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)

xaromz 18. Apr 2007 08:19


Kurze Dateinamen anlegen
 
Hallo,

ich musste gerade feststellen, dass Vista keine kurzen Dateinamen mehr anlegt. Kennt jemand ein Programm, mit dem ich die Dateiattribute inklusive kurzem Dateinamen ändern kann?

Gruß
xaromz

marabu 18. Apr 2007 10:31

Re: Kurze Dateinamen anlegen
 
Hallo,

die API Funktion SetFileShortName() gibt es doch auch noch unter Vista - oder?

Grüße vom marabu

sakura 18. Apr 2007 10:36

Re: Kurze Dateinamen anlegen
 
Also bei mir macht Vista es ohne Murren...
Code:
C:\Program Files>dir /x
 Volume in Laufwerk C: hat keine Bezeichnung.
 Volumeseriennummer: 8C3F-412E

 Verzeichnis von C:\Program Files

18.04.2007  10:49    <DIR>                      .
18.04.2007  10:49    <DIR>                      ..
16.03.2007  11:41    <DIR>                      Adobe
02.03.2007  10:59    <DIR>         BITLOC~1     BitLocker
09.02.2007  14:25    <DIR>         CEREMO~1     CE Remote Tools
12.03.2007  16:13    <DIR>         CLICK-~1     Click-and-Drink Shop Client
25.03.2007  15:02    <DIR>                      CodeGear
02.04.2007  12:36    <DIR>         COMMON~1     Common Files
18.04.2007  10:49    <DIR>         GIFMOV~1     GIF Movie Gear
09.02.2007  14:32    <DIR>         HTMLHE~1     HTML Help Workshop
12.02.2007  11:27    <DIR>         INTERN~1     Internet Explorer
03.03.2007  16:40    <DIR>         MICROS~3.NET Microsoft ASP.NET
09.02.2007  14:40    <DIR>         MI9C2B~1     Microsoft Device Emulator
12.02.2007  11:47    <DIR>         MICROS~1     Microsoft Games
09.02.2007  14:52    <DIR>         MI1933~1     Microsoft Office
08.03.2007  10:42    <DIR>         MI6841~1     Microsoft SQL Server
09.02.2007  14:40    <DIR>         MI40D9~1     Microsoft SQL Server 2005 Mobile Edition
09.02.2007  13:19    <DIR>         MICROS~3     Microsoft Visual Studio
12.02.2007  11:34    <DIR>         MICROS~2.NET Microsoft Visual Studio .NET 2003
09.02.2007  16:01    <DIR>         MICROS~2     Microsoft Visual Studio 8
09.02.2007  13:20    <DIR>         MICROS~4     Microsoft Works
09.02.2007  14:42    <DIR>         MICROS~1.NET Microsoft.NET
12.02.2007  11:13    <DIR>         MOVIEM~1     Movie Maker
09.02.2007  13:19    <DIR>                      MSBuild
14.02.2007  11:28    <DIR>                      MSECache
02.11.2006  14:35    <DIR>                      MSN
12.02.2007  11:40    <DIR>         MSXML4~1.0   MSXML 4.0
02.04.2007  12:36    <DIR>                      Nero
02.11.2006  14:35    <DIR>         REFERE~1     Reference Assemblies
19.02.2007  11:45    <DIR>         RESOUR~1     Resource Kit
13.02.2007  17:41    <DIR>         SMARTF~1.0   SmartFTP Client 2.0
09.02.2007  12:57    <DIR>                      Tablet
02.04.2007  17:07    <DIR>                      Virtools
12.02.2007  11:13    <DIR>         WIF3F6~1     Windows Calendar
12.02.2007  11:13    <DIR>         WICE93~1     Windows Collaboration
12.04.2007  09:32    <DIR>         WINDOW~3     Windows Defender
12.02.2007  11:13    <DIR>         WI0FCF~1     Windows Journal
12.02.2007  18:04    <DIR>         WIE5D0~1     Windows Live Safety Center
12.04.2007  09:27    <DIR>         WINDOW~1     Windows Mail
12.02.2007  11:13    <DIR>         WI4EB4~1     Windows Media Player
09.02.2007  12:14    <DIR>         WINDOW~2     Windows NT
12.02.2007  11:13    <DIR>         WINDOW~4     Windows Photo Gallery
12.02.2007  11:13    <DIR>         WICC9F~1     Windows Sidebar
19.02.2007  14:22    <DIR>         XNRESO~1     XN Resource Editor
               0 Datei(en),             0 Bytes
              44 Verzeichnis(se), 95.873.321.984 Bytes frei
...:cat:...

xaromz 18. Apr 2007 10:48

Re: Kurze Dateinamen anlegen
 
Hallo,

dann weiß ich auch nicht, wass das soll. Ich habe hier eine Festplatte aus einem WinXP-Rechner. Weil ich das System neu aufsetzen, aber das Original sichern wollte, habe ich einfach "Programme", "Windows" und "Dokumente und Einstellungen" in der Eingabeaufforderung der Vista-CD umbenannt. Nachdem die Neuinstallation nicht so geklappt hat, wie ich das wollte, habe ich die Ordner genauso wieder zurückbenannt. Als ich dann nachgesehen habe (weil viele Programme nicht mehr liefen), war die Spalte mit den kurzen Dateinamen einfach leer. Alte Win31-Programme zeigen auch die Ordner nicht an.

Inzwischen habe ich die Platte an einen WinXP-Rechner gehängt, einfach einen neuen Programme-Ordner erzeugt und den Inhalt des alten verschoben. Aber das kann es ja nicht sein.

Gruß
xaromz

Luckie 18. Apr 2007 11:34

Re: Kurze Dateinamen anlegen
 
Man kann die Speicherung der kurzen Dateinamen im Dateisystem deaktivieren. War das eventuell bei der XP Installation der Fall?

xaromz 18. Apr 2007 11:42

Re: Kurze Dateinamen anlegen
 
Hallo,
Zitat:

Zitat von Luckie
Man kann die Speicherung der kurzen Dateinamen im Dateisystem deaktivieren. War das eventuell bei der XP Installation der Fall?

nein, die Installation hat ja kurze Dateinamen benutzt, das ist ja mein Problem. Ich denke eher, die Speicherung kurzer Dateinamen ist im Reparaturmodus der Vista-DVD deaktiviert.

Gruß
xaromz

Delphi-Laie 15. Jan 2009 12:28

Re: Kurze Dateinamen anlegen
 
Zitat:

Zitat von xaromz
Kennt jemand ein Programm, mit dem ich die Dateiattribute inklusive kurzem Dateinamen ändern kann?

An einem solchen Programm werkel(t)e ich, und bis auf die SetFileShortName-Funktion ist es fertig. Wie man diese Funktion aufgerufen bekommt, ist mir unbekannt. Delphi4 jedenfalls kennt sie auch auf XP nicht. Und alle möglichen Delphis oder auch nur ein zusätzliches Delphi (Version 7) zusätzlich nur deshalb auf meinem XP zu installieren, habe ich keine Lust. Delphi 7, einstmals auf einem Win2000 installiert, kannte diese Funktion (wenigstens auf diesem Betriebsprogramm) jedenfalls auch nicht. Wie man Delphi unbekannte WinAPIs aufruft, weiß ich als Delphi-Laie natürlich (auch) nicht. Ich weiß also verdammt wenig.

Diese Funktion scheint jedenfalls so exotisch zu sein, so selten benötigt zu werden, daß ich nur diese eine Diskussion dazu überhaupt fand.

Ein gutes diesbezügliches Programm, wenn auch ohne die nahezu überflüssige (?) Editierung des kurzen (DOS-(kompatiblen)) Dateinamens, ist auch Winattrib bei lab1/toolsandmore von Herrn Wolfgang Wirth (das soll jetzt aber keine (unzulässige?) Werbung sein).

Delphi-Laie 15. Jan 2009 12:33

Re: Kurze Dateinamen anlegen
 
Zitat:

Zitat von Luckie
Man kann die Speicherung der kurzen Dateinamen im Dateisystem deaktivieren.

Darf ich Dich, Luckie/Michael, vorsichtig fragen, wie man das tut? War mir bis dato eine unbekannte Option....

himitsu 15. Jan 2009 13:12

Re: Kurze Dateinamen anlegen
 
Zitat:

Delphi4 jedenfalls kennt sie auch auf XP nicht.
wenn dein Delphi diese Funktion nicht kennt, dann implementier sie doch einfach selber.

(wie die Deklaration aussieht, steht schließlich im MSDN/PSDK)
MSDN-Library durchsuchenSetFileShortName

Delphi-Laie 15. Jan 2009 13:37

Re: Kurze Dateinamen anlegen
 
Zitat:

Zitat von himitsu
Zitat:

Delphi4 jedenfalls kennt sie auch auf XP nicht.
wenn dein Delphi diese Funktion nicht kennt, dann implementier sie doch einfach selber.

(wie die Deklaration aussieht, steht schließlich im MSDN/PSDK)
MSDN-Library durchsuchenSetFileShortName

Nun, im MSDN fand ich die damals auch schon längst.

Nur ist die Antwort "sie doch einfach selber" zu implementieren, nicht unbedingt eine solche, mit der ich als Delphi-Laie allzuviel anfangen kann. Wenn ich wüßte, wie das geht (wenn man es weiß, ist es sicher trivial), dann hätte ich es schon längst getan. Gibt es einen - mir unbekannten - Befehl für Delphi, den nachfolgenden Ausdruck als Windows-API-Funktion aufzurufen (und eben nicht vergebens in den Units danach zu suchen)?

Ich gebe den Funktionsnamen in den Delphi-Quelltext ein, und dort wird sie weder von der "Sofortunterstützung nach Eingabe des Wortes" (wie lautet der Fachausdruck dazu?) noch vom Compiler beim Übersetzungsversuch erkannt. Es gibt natürlich API-Rubriken in den Foren, aus denen ich aber noch nicht schlau geworden bin.

Und damit bin ich als Laie eben schon am Ende meines immer noch ziemlich kleinen Delphi-Latinums, leider.

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