![]() |
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 |
Re: Kurze Dateinamen anlegen
Hallo,
die API Funktion SetFileShortName() gibt es doch auch noch unter Vista - oder? Grüße vom marabu |
Re: Kurze Dateinamen anlegen
Also bei mir macht Vista es ohne Murren...
Code:
...:cat:...
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 |
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 |
Re: Kurze Dateinamen anlegen
Man kann die Speicherung der kurzen Dateinamen im Dateisystem deaktivieren. War das eventuell bei der XP Installation der Fall?
|
Re: Kurze Dateinamen anlegen
Hallo,
Zitat:
Gruß xaromz |
Re: Kurze Dateinamen anlegen
Zitat:
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). |
Re: Kurze Dateinamen anlegen
Zitat:
|
Re: Kurze Dateinamen anlegen
Zitat:
(wie die Deklaration aussieht, steht schließlich im MSDN/PSDK) ![]() |
Re: Kurze Dateinamen anlegen
Zitat:
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. |
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:
Delphi-Quellcode:
[add]
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'; 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'; |
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. |
Re: Kurze Dateinamen anlegen
|
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. |
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 |
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) |
Re: Kurze Dateinamen anlegen
laß mal dieses (ur)alte
![]() ![]() Bei dwFlagsAndAttributes kannst du dann das Flag FILE_FLAG_BACKUP_SEMANTICS mit angeben. |
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:
Natürlich habe ich schon einiges an Aufrufvarianten probiert.... Wie schon angedeutet, ich beiße mich nicht daran fest.
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)); |
Re: Kurze Dateinamen anlegen
Bitte löschen, doppelter Beitrag.
|
Re: Kurze Dateinamen anlegen
Delphi-Quellcode:
FILE_ATTRIBUTE_NORMAL wird nur verwendet (muß es aber nicht ... einfach nur 0 geht auch), wenn sonst kein anderes Attribut gesetzt ist.
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; Und dann werden Attribute (Bits) per OR verknüpft. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:56 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz