Autor Beitrag
sbit
Hält's aus hier
Beiträge: 4



BeitragVerfasst: So 26.09.10 17:58 
Hallo zusammen,

ich suche nach einer Möglichkeit per Code die maximal mögliche Dateigröße auf einer gegebenen Partition zu bestimmen (auslesen oder berechnen). Ich habe jetzt eine Weile gesucht aber nichts Erbauliches gefunden. Die File-, Volume- und Disk-APIs scheinen das nicht herzugeben. Hat da jemand eine Idee für mich?

Vielen Dank schonmal, und viele Grüße,
sbit.

p.s.: Die einzige Möglichkeit die ich bisher gefunden habe, ist den Dateisystemsnamen per GetVolumeInformation zu holen, und den dann über eine kleine Liste mit unterstützten Dateisystemen mit dazugehörigen bisher bekannten maximalen Dateigrößen zu verbinden. Aber diese Methode hat verschiedene Nachteile: Sie ist nicht exakt, da verschiedene Partitionen mancher Dateisysteme verschiedene maximale Dateigrößen haben können. Auch liefern manche Dateisysteme keinen verwertbaren Namen zurück, sind leer oder "*NT5CSC" oder dergleichen. Außerdem funktioniert die Methode nicht für zukünftige noch unbekannte Dateisysteme.

Eine andere Möglichkeit bestünde darin diesen Wert zu umschiffen und beim Versuch zu weit zu schreiben auf Fehler zu prüfen oder Exceptions abzufangen. Das würde ich aber gern vermeiden um die Geschwindigkeit nicht zu beeinträchtigen.

Weiß jemand wie Windows selbst das macht?
ALF
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1085
Erhaltene Danke: 53

WinXP, Win7, Win10
Delphi 7 Enterprise, XE
BeitragVerfasst: So 26.09.10 19:39 
Hi, und :welcome:
Mh, verstehe es nicht ganz was Du möchtest. Partitionen auslesen ist ja nicht ganz so schwer, aber was nutzt es Dir, das es eine Linuxpartition(ext2) z.B ist, wenn Du über Windows sowieso nicht drauf schreiben kannst. Oder Apel, Mac Partitionen. Die MaxDateigrösse die Du ablegen kannst ist , bis auf FAT32, bei den jetztigen, fast gleich der jeweiligen Partition, siehe Datenbanken.

Sonnst wüsste ich nicht was man da evtl. berechnen müsste. Oder ich hab Dich falsch verstanden? :gruebel:

Gruss Alf

_________________
Wenn jeder alles kann oder wüsste und keiner hätt' ne Frage mehr, omg, währe dieses Forum leer!
BenBE
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: So 26.09.10 20:46 
Was? Wie? Windows kann kein Ext2?

Ext2UnterWindows

Hab hier ne Ext3-Partition seit JAHREN unter Windows 2000 im Einsatz ;-)

Ach ja: Der Ansatz mit MaxFileSize anhand des FS geht übrigens insbesondere bei Ext3 nicht: Dort entscheidet sich der 4GB-Support anhand eines Flags beim Formatieren (Und unter Windows zusätzlich beim Treiber, ob man's aktiviert).
Einloggen, um Attachments anzusehen!
_________________
Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
ALF
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1085
Erhaltene Danke: 53

WinXP, Win7, Win10
Delphi 7 Enterprise, XE
BeitragVerfasst: So 26.09.10 21:40 
user profile iconBenBE hat folgendes geschrieben Zum zitierten Posting springen:
Was? Wie? Windows kann kein Ext2?

Aber doch nur mit zusätzlicher Software/Treiber dafür. :wink:
Meine Antwort bezog sich doch auch auf den normalen Windowsbenutzter :lol:
Gruss Alf

_________________
Wenn jeder alles kann oder wüsste und keiner hätt' ne Frage mehr, omg, währe dieses Forum leer!
sbit Threadstarter
Hält's aus hier
Beiträge: 4



BeitragVerfasst: Mo 27.09.10 03:47 
Hallo Ihr beiden, und vielen Dank für Eure Antworten!

An Eurer Diskussion kann man schon die Problematik erkennen. Z.B. ext2 (ist mir schon ein paarmal vor die Finger gekommen) ist mir bekannt 16GB bis 2TB (max. Dateigrößen) zu unterstützen, aber wie bekomme ich raus, welche in einem speziellen Fall? Wenn ich mir den ext2-Eigenschaften-Dialog da so anschaue, habe ich meine Zweifel ob ich das hinbekomme (Windows scheint das in dem Fall selbst nicht zu wissen wenn ich die "0 Bytes" da sehe).

Zurück zum Anfang: Ich schreibe Software die große, bis manchmal sehr große Dateien erstellt. Bis vor einiger Zeit waren die intern selbst auf 4GB beschränkt, aber das habe ich geändert, habe aber noch keine gute Sicherheit für's Überschreiten der erlaubten Größen drin. Momentan habe ich die besagte Liste im Einsatz nachdem mir die Version mit Error-Check zu langsam erschien (die wäre zwar noch deutlich optimierbar, aber das bin ich noch nicht angegangen). Momentan hat die Liste 17 Einträge von Systemen die die möglichen Windows-Versionen unterstützen könnten (da sind zwar einige drin, die eigentlich raus könnten, weil zu alt, zu exotisch, oder quasi (noch) ohne Beschränkung, aber es fehlen auch noch welche von denen ich die Windows-Unterstützung nicht weiß). Nun suche ich eine allgemeine Möglichkeit, mit der ich die Nachteile der Listen-Version umschiffen könnte. Also eine Version, die vor dem Erstellen der Datei weiß wie groß sie werden darf. Das erscheint mir die schnellste Möglichkeit, so sie denn realisierbar ist.

Naja, und die Sache mit dem "normalen Windowsbenutzer" trifft hier leider nicht zu. Ihr ahnt ja nicht was die Jungs (und Mädels natürlich) an Instituten und Universitäten so alles im Einsatz haben. Die haben da Lustre, Reiser, HFS und weiß der Himmel was sonst noch, und schreiben sich ihre eigenen Treiber dafür. Und meine Hoffnung war jetzt, daß eben diese Treiber Windows anständig die Parameter mitteilen, und ich das irgendwo zentral abfragen könnte (wobei mir der ext2-Dialog oben ebendiese ein bißchen genommen hat).

Viele Grüße,
sbit.
BenBE
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: Mo 27.09.10 04:32 
user profile iconsbit hat folgendes geschrieben Zum zitierten Posting springen:
Hallo Ihr beiden, und vielen Dank für Eure Antworten!

An Eurer Diskussion kann man schon die Problematik erkennen. Z.B. ext2 (ist mir schon ein paarmal vor die Finger gekommen) ist mir bekannt 16GB bis 2TB (max. Dateigrößen) zu unterstützen, aber wie bekomme ich raus, welche in einem speziellen Fall? Wenn ich mir den ext2-Eigenschaften-Dialog da so anschaue, habe ich meine Zweifel ob ich das hinbekomme (Windows scheint das in dem Fall selbst nicht zu wissen wenn ich die "0 Bytes" da sehe).

Nene, siehe Bildbeschreibung im Anhang; ist von mir bearbeitet, um die Plattengröße nicht preiszugeben. Die angezeigten Daten von Windows sind durchaus korrekt.

user profile iconsbit hat folgendes geschrieben Zum zitierten Posting springen:
Zurück zum Anfang: Ich schreibe Software die große, bis manchmal sehr große Dateien erstellt. Bis vor einiger Zeit waren die intern selbst auf 4GB beschränkt, aber das habe ich geändert, habe aber noch keine gute Sicherheit für's Überschreiten der erlaubten Größen drin. Momentan habe ich die besagte Liste im Einsatz nachdem mir die Version mit Error-Check zu langsam erschien (die wäre zwar noch deutlich optimierbar, aber das bin ich noch nicht angegangen). Momentan hat die Liste 17 Einträge von Systemen die die möglichen Windows-Versionen unterstützen könnten (da sind zwar einige drin, die eigentlich raus könnten, weil zu alt, zu exotisch, oder quasi (noch) ohne Beschränkung, aber es fehlen auch noch welche von denen ich die Windows-Unterstützung nicht weiß). Nun suche ich eine allgemeine Möglichkeit, mit der ich die Nachteile der Listen-Version umschiffen könnte. Also eine Version, die vor dem Erstellen der Datei weiß wie groß sie werden darf. Das erscheint mir die schnellste Möglichkeit, so sie denn realisierbar ist.

Man sollte immer so eine Kombination aus Definitiver Blacklist, Warnlist und einer sauberen Fehlerbehandlung verwendet werden. "Wir glauben das von ihnen verwendete Dateisystem unterstützt möglicherweise keine Dateien größer 4GB, wollen Sie trotzdem fortfahren?" ... Wäre ggf. ja auch ne Möglichkeit ;-)

user profile iconsbit hat folgendes geschrieben Zum zitierten Posting springen:
Naja, und die Sache mit dem "normalen Windowsbenutzer" trifft hier leider nicht zu. Ihr ahnt ja nicht was die Jungs (und Mädels natürlich) an Instituten und Universitäten so alles im Einsatz haben. Die haben da Lustre, Reiser, HFS und weiß der Himmel was sonst noch, und schreiben sich ihre eigenen Treiber dafür. Und meine Hoffnung war jetzt, daß eben diese Treiber Windows anständig die Parameter mitteilen, und ich das irgendwo zentral abfragen könnte (wobei mir der ext2-Dialog oben ebendiese ein bißchen genommen hat).

Viele Grüße,
sbit.

Naja, wie bereits in der Beschreibung zum Dialog gesagt: Ist von mir nachbearbeitet; Windows sagt die korrekten Daten durchaus an.

Gruß,
BenBE.

_________________
Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
Gerd Kayser
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 632
Erhaltene Danke: 121

Win 7 32-bit
Delphi 2006/XE
BeitragVerfasst: Mo 27.09.10 04:54 
user profile iconsbit hat folgendes geschrieben Zum zitierten Posting springen:
ich suche nach einer Möglichkeit per Code die maximal mögliche Dateigröße auf einer gegebenen Partition zu bestimmen (auslesen oder berechnen). Ich habe jetzt eine Weile gesucht aber nichts Erbauliches gefunden. Die File-, Volume- und Disk-APIs scheinen das nicht herzugeben. Hat da jemand eine Idee für mich?

Mit DeviceIOControl den ersten Sektor der jeweiligen Partition auslesen, sofern Windows darauf zugreifen kann (Treiber, Adminrechte usw.). Ist aber nicht trivial. Mit jeder Windowsversion ändert sich da ständig was. Außerdem wird das nicht im Netzwerk auf anderen Rechnern funktionieren. Auf jeden Fall läuft das auf ausgiebiges Studium des "Kleingedruckten" bei den API-Funktionen hinaus ...

Mit den Daten aus den Sektoren kannst Du ermitteln, welches Dateisystem vorliegt (FAT12, FAT16, FAT32, NTFS usw.). Damit kennst Du auch die maximale Dateigröße, die Du dazu in Deinem Programm hinterlegen kannst. GetDiskFreeSpace(Ex) z. B. liefert den freien Platz (wichtig im Hinblick auf das Quota-Management).

Zitat:
Außerdem funktioniert die Methode nicht für zukünftige noch unbekannte Dateisysteme.
Dafür mußt Du erfolgreich einen Meisterkursus in Kaffeesatzleserei absolviert haben. ;-)

Zitat:
Eine andere Möglichkeit bestünde darin diesen Wert zu umschiffen und beim Versuch zu weit zu schreiben auf Fehler zu prüfen oder Exceptions abzufangen.
Ein vernünftiges Fehlerhandling ist generell ein absolutes Muß.

Hier noch einige nützliche Links:

www.ntfs.com/ntfs_vs_fat.htm
en.wikipedia.org/wik...ison_of_file_systems
www.lowlevel.eu/wiki...isystem_benutzt_wird
technet.microsoft.co...bb968968(en-us).aspx
technet.microsoft.co...ernals/bb842062.aspx
www.findthatfile.com...oad-magwmi52-zip.htm (für Abfragen mit WMI)

Außerdem solltest Du Dir die entsprechenden Windows-SDK's von Microsoft saugen:
msdn.microsoft.com/d...indows/bb980924.aspx (riesige Downloads!)

Damit solltest Du genügend Lesestoff für die nächsten paar Wochen haben. ;-)
sbit Threadstarter
Hält's aus hier
Beiträge: 4



BeitragVerfasst: Mo 27.09.10 06:20 
Hallo Ihr beide,

ja, ich denke als Fazit wird sich die Version mit fast-nur-über-Fehlerbehandlung nicht umgehen lassen (gepaart mit ein paar Einträgen, die sicher bekannt sind).
Es ist nicht so daß jetzt keine Fehlerbehandlung da wäre, aber die ist relativ weit außen gekapselt (auch mit Quota Management und dgl.) und muß hierfür nach innen erweitert werden.

Die Nummer mit dem Kaffeesatz ist dabei eins der Killerkriterien. Ich könnte mir 'ne Menge Mühe machen und für manch bekanntes System eine Antwort finden um beim nächsten neuen System dann doch zu versagen. Und die Sache mit dem Sektoren Auslesen ist mir dann zu hip. Ich habe mittlerweile einiges über diverse Formate gelesen und dabei eins als gewiß gefunden: Es gibt dabei keine ersichtlichen Standards. Wenn ich da anfange, höre ich nie auf. Entweder jemand (Microsoft) hat sich schon die Mühe gemacht, das auf einen Nenner zu bringen, oder es ist kaum in Reichweite. Außerdem beschleicht mich das Gefühl, das Microsoft das eben noch nicht gemacht hat (sonst wäre es bestimmt zugreifbar und dokumentiert) und genau den gleichen Weg geht den ich jetzt auch gehe.

Wenn ich noch etwas Schlaueres zu dem Thema in Erfahrung bringe, schreibe ich es hier.

Vielen Dank nochmal Euch allen für die vielen Anregungen und den Lesestoff (dem werde ich mich noch detailliert widmen)!

Viele Grüße,
Stefan.
Reinhard Kern
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 591
Erhaltene Danke: 14



BeitragVerfasst: Mo 27.09.10 12:56 
user profile iconsbit hat folgendes geschrieben Zum zitierten Posting springen:
p.s.: Die einzige Möglichkeit die ich bisher gefunden habe, ist den Dateisystemsnamen per GetVolumeInformation zu holen, und den dann über eine kleine Liste mit unterstützten Dateisystemen mit dazugehörigen bisher bekannten maximalen Dateigrößen zu verbinden.


Hallo,

auch das führt in die Irre: Windows XP meldet für die Freigaben auf meinem Installationsserver NTFS (in Wahrheit ext3 und SAMBA). Man darf also bei Netzlaufwerken auch dann nichts glauben, wenn etwas eindeutig angegeben ist.

Gruss Reinhard
sbit Threadstarter
Hält's aus hier
Beiträge: 4



BeitragVerfasst: Mo 27.09.10 15:33 
Hallo Reinhard,

oh Mann, stimmt. Zugegeben, ich war sogar ein bißchen überrascht daß das so wunderbar funktionierte (aber die Freigaben waren halt auch wirklich NTFS). Wieder zu früh gefreut. Mit FAT32-Freigaben aus 2k heraus bekomme ich, wie ich jetzt sehe, FAT statt FAT32 und NTFS.

Microsoft ... :roll: , aber wenn Die die danach fragen willst, kostet das 299 Dollar...

Danke für den Hinweis, das hätte mich sicherlich wieder einige Zeit und Nerven gekostet. Also weg mit dem Mist, ist zwar ärgerlich, aber was soll ich machen. Erweiterte Fehlerbehandlung und sonst nichts.

Viele Grüße,
Stefan.