Autor Beitrag
Yogu
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2598
Erhaltene Danke: 156

Ubuntu 13.04, Win 7
C# (VS 2013)
BeitragVerfasst: Mo 16.04.07 17:42 
Wie ermittel ich die Laufwerkbezeichnung, -größe, -typ und den freien speicherplatz?[meta]Zugriffsverletzung, Laufwerk, freier Speicherplatz, Laufwerktyp, Laufwerkbezeichnung[/meta]

Lösung: Bezeichner und Typ und [url=www.swissdelphicente...]Speicherplatz[/url]

Hallo

Also, ich mach gerade ein Setup, und das soll den freien Speicherplatz und vielleicht noch die größe der Laufwerke auflisten, um zu schauen, welche Laufwerke für die Installation in Frage kommen würden.
Da habe ich 2 Probleme:

  • Laufwerktyp und -bezeichnung
    Ich gehe gerade alle Buchstaben von B bis Z durch. Nicht A, weil da immer die doofe Meldung kommt, dass man einen Datenträger einlegen soll (bei Diskette). Ich weiß, das ist blöd, es könnte ja auch jemand B als Diskettenlaufwerk gewählt haben. Hat jemand eine Lösung dafür?

  • Laufwerkgröße und freier Speicherplatz
    Wenn ich die Funktion DiskSize oder DiskFree verwende, kommt (fast) immer eine negative Zahl heraus, meine primäre Platte hat momentan -553 MB und 103 MB sind frei. (Eigentlich sollten das 35,4 GB sein und 4,10 GB frei) Ich denke, dass da irgendeine Umwandlung nötig ist, und nicht IntToStr. Kennt sich jemand damit aus?

Dann noch ein
PS: gibt es eine Möglichkeit, einen Delphi-Befehl mit einem BB-Code oder so vorzuheben, vielleicht noch mit Verweiß auf eine kurze Hilfe :?:
Wenn es das noch nicht geben sollte, fände ich gut, wenn das eingeführt werden würde.


Zuletzt bearbeitet von Yogu am Mo 13.12.10 18:21, insgesamt 7-mal bearbeitet
rizla
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 417
Erhaltene Danke: 2

XP
FPC mit Lazarus
BeitragVerfasst: Mo 16.04.07 18:09 
Hi,
zum ersten: warum icht alle Laufwerke von B bis Z checken?

zum zweiten: diskfree gibt ja kein integer zurück sondern ein int64, daher der umwandlungsfehler. würde auch die api-fkt GetDiskFreeSpaceEx benutzen, denn das kann hdspace über 2gb zurückgeben. an deiner stelle würd ich das ergebnis auch nochmal so'n wenig umwandeln: ich glaub, die wenigsten menschen können was mit bytes anfangen ;)
von daher alles von bytes in mb oder halt gb umrechen..

:r:

_________________
if you have what they want - they'll find a way to take it (bruce sterling)
WOW - 10 JAHRE Mitglied beim Delphi-Forum. Wie die Zeit vergeht, Freunde.
JayEff
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2971

Windows Vista Ultimate
D7 Enterprise
BeitragVerfasst: Mo 16.04.07 18:14 
Zu deiner zweiten Frage: 35 GB sind 37580963840 Byte. Die maximalgröße von Int64, welches die Funktion DiskSize als Rückgabe liefert, liegt bei 92864388. 35GB mod sizeof(int64) ist 53368376... Soll heißen: Das ist der Rest, der übrig bleibt, wenn man versucht, 35 GB in einen Int64 zu packen... Schade, dass jemand schneller war als ich :motz:

Wegen deiner PS Frage: Ja, gibt's: Die Delphi-Tags. Die funktionieren Inline, das heißt, wenn was drum rum ist, und der code kürzer als .. naja, eine Zeile ist (genaue Zeichenanzahl :gruebel: ), dann wird kein weißes Feld um den Code gelegt so wie  hier in diesem beispiel (and or procedure ! toll! ) deutlich ersichtlich ist. :mrgreen:

_________________
>+++[>+++[>++++++++<-]<-]<++++[>++++[>>>+++++++<<<-]<-]<<++
[>++[>++[>>++++<<-]<-]<-]>>>>>++++++++++++++++++.+++++++.>++.-.<<.>>--.<+++++..<+.
Yogu Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2598
Erhaltene Danke: 156

Ubuntu 13.04, Win 7
C# (VS 2013)
BeitragVerfasst: Mo 16.04.07 18:19 
Um es vorneweg zu nehmen:
Ich hab eine Umwandlung, und zwar hab ich mir eine eigene Funktion geschrieben, die Windowsecht Dateigrößen von Byte bis TB berechnet, und mit negativen Zahlen klarkommt:

ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
function FileSizeToStr(Size: Integer): String;
var N: String;
begin
  //Negativation
  if Size < 0 then begin N := '-'; Size := -Size; end else N := '';
  //#### Byte
  if Size < 1024 then begin Result := N+IntToStr(Size)+' Byte'; Exit; end;
  //##,## KB
  if Size < 1024*100 then begin Result :=
    N+FloatToStrF(Size / 1024, ffNumber, 4,2)+' KB'; Exit; end;
  //#### KB
  if Size < 1024*1024 then begin Result :=
    N+IntToStr(Size div 1024)+' KB'; Exit; end;
  //##,## MB
  if Size < 1024*1024*100 then begin Result :=
    N+FloatToStrF(Size/1024/1024, ffNumber, 4,2)+' MB'; Exit; end;
  //#### MB
  if Size < 1024*1024*1024 then begin Result :=
    N+IntToStr(Size div 1024 div 1024)+' MB'; Exit; end;
  //MB und TB
  Size := Size div 1024 div 1024;
  //##,## GB
  if Size < 1024*100 then begin Result :=
    N+FloatToStrF(Size/1024, ffNumber, 4,2)+' GB'; Exit; end;
  //#### GB
  if Size < 1024*1024 then begin Result :=
    N+IntToStr(Size div 1024)+' GB'; Exit; end;
  //##,## TB
  if Size < 1024*1024*100 then begin Result :=
    N+FloatToStrF(Size/1024/1024, ffNumber, 4,2)+' TB'; Exit; end;
  //#### TB
  if Size < 1024*1024*1024 then begin Result :=
    N+IntToStr(Size div 1024 div 1024)+' TB'; Exit; end;
end;


Klappt auch wunderbar, vor allem die negativen Größen brauche ich. ;-)
Mir ist auch gerade aufgefallen, mein 1GB-Laufwerk wird wunderbar angezeigt. Also gibts da Probleme bei größeren Größen.

Woher bekomme ich diese GetDiskFreeSpaceEx?
rizla
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 417
Erhaltene Danke: 2

XP
FPC mit Lazarus
BeitragVerfasst: Mo 16.04.07 18:29 
JayEff, stay cool :zwinker:
solche .ex funktionen sind immer in irgendwelchen windows-dlls (ich glaub ja in kernel32.dll ;)). musst mal in der win32-help nach suchen, aber ich denke, die ist in der [uses] windows mit dabei..
musst halt mal eingeben, delphi wird schon meckern.

_________________
if you have what they want - they'll find a way to take it (bruce sterling)
WOW - 10 JAHRE Mitglied beim Delphi-Forum. Wie die Zeit vergeht, Freunde.
Karlson
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 2088



BeitragVerfasst: Mo 16.04.07 18:35 
Zu 1.) (alle Festplatten und derren Bezeichner ermitteln)

www.swissdelphicente.../showcode.php?id=562

Zu 2.) (Kapazität, freien Speicherplatz ermitteln mit GetDiskFreeSpaceEx)

www.swissdelphicente.../showcode.php?id=654
Yogu Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2598
Erhaltene Danke: 156

Ubuntu 13.04, Win 7
C# (VS 2013)
BeitragVerfasst: Mo 16.04.07 19:11 
Danke @Karlson! Endlich mal ein vernünftiger Quellcode. Was für Funktionen Delphi doch immer noch beherrscht, ohne dass ich es weiß. Ich durchsuche die Hilfe immer zehnmal, aber das richtige finde ich nicht. Ich schreibe die Funktionen jetzt für mich noch ein bisschen um, dann müsste das alles eigentlich klappen.
Karlson
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 2088



BeitragVerfasst: Mo 16.04.07 19:25 
Gern geschehen.

Bei Sachen die aufs System abzielen (und nicht allzu kompliziert sind) lohnt sich ein Besuch beim [url=www.swissdelphicente...ssDelphiCenter[/url] immer! Die Programmiertips sind wirklich zu empfehlen.

Die GetDiscFreeEx Funktion beherscht übrigens sogesehen nicht Delphi sondern Windows. Delphi macht einem nur den Aufruf so einfach wie möglich.
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: Di 17.04.07 00:57 
Ansonsten: Nehme omorphia.svn.sourcef...Main.pas?view=markup ab Zeile 266.

Die benötigten referenzierten Funktionen gibt's unter omorphia.svn.sourcef...phia/source/library/

Einfach Dir das ganze mal anschauen ... Funzt auch für große Platten :P

_________________
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.
Yogu Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2598
Erhaltene Danke: 156

Ubuntu 13.04, Win 7
C# (VS 2013)
BeitragVerfasst: Di 17.04.07 19:56 
So, sieht ja ganzu gut aus, der Nachteil ist, dass nix klappt. Hier irgendwo ist ein Zugriffsverletzungs-Fehler:

ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
101:
102:
103:
104:
105:
106:
107:
108:
109:
110:
111:
112:
113:
114:
115:
116:
117:
118:
119:
120:
121:
122:
123:
124:
125:
126:
127:
128:
129:
130:
131:
132:
133:
134:
135:
136:
137:
138:
139:
140:
141:
142:
143:
144:
145:
146:
147:
148:
149:
150:
151:
152:
153:
154:
155:
156:
157:
158:
159:
160:
161:
162:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  FileExt, ComCtrls;

type
  TForm1 = class(TForm)
    T4_4: TListView;
    procedure FormCreate(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

//Wandelt eine Byte-Dateigröße in einen String um      
function FileSizeToStr(Size: Integer): String;

//Listet die Laufwerke mit Typ und Verzeichnis auf
function ListDrives: TList;

//Gibt die Größe eines Laufwerks zurück
function GetDiskSize(Drive: Char): LongInt;

//Gibt den freien Speicherplatz eines Laufwerks zurück
function GetDiskFree(Drive: Char): LongInt;

implementation

{$R *.DFM}

procedure TForm1.FormCreate(Sender: TObject);
var Drives: TList; i: Integer; Tmp: TListItem; Drv: TDrive;
begin
  Drives := ListDrives;
  for i := 0 to Drives.Count-1 do
  begin
    Drv := TDrive(Drives.Items[i]);
    ShowMessage(Drv.Caption+': '+IntToStr(Drv.DriveType)+' ('+Drv.DriveChar+')');
    if Drv.DriveType = dtFixed then
    begin
      //GetDiskSize(Drv.DriveChar);

      Tmp := T4_4.Items.Add;
      Tmp.Caption := Drv.Caption;
      Tmp.ImageIndex := 5;
      Tmp.StateIndex := 5;
      Tmp.SubItems.Add(FileSizeToStr(GetDiskSize(Drv.DriveChar)));
      Tmp.SubItems.Add(FileSizeToStr(GetDiskFree(Drv.DriveChar)));
    end;
  end;
end;

function FileSizeToStr(Size: Integer): String;
var N: String;
begin
try
  //Negativation
  if Size < 0 then begin N := '-'; Size := -Size; end else N := '';
  //#### Byte
  if Size < 1024 then begin Result := N+IntToStr(Size)+' Byte'; Exit; end;
  //##,## KB
  if Size < 1024*100 then begin Result :=
    N+FloatToStrF(Size / 1024, ffNumber, 4,2)+' KB'; Exit; end;
  //#### KB
  if Size < 1024*1024 then begin Result :=
    N+IntToStr(Size div 1024)+' KB'; Exit; end;
  //##,## MB
  if Size < 1024*1024*100 then begin
    Result := N+FloatToStrF(Size/1024/1024, ffNumber, 4,2)+' MB'; Exit; end;
  //#### MB
  if Size < 1024*1024*1024 then begin
    ShowMessage(N+IntToStr(Size div 1024 div 1024)+' MB'); Exit; end;
  //MB und TB
  Size := Size div 1024 div 1024;
  //##,## GB
  if Size < 1024*100 then begin Result :=
    N+FloatToStrF(Size/1024, ffNumber, 4,2)+' GB'; Exit; end;
  //#### GB
  if Size < 1024*1024 then begin Result :=
    N+IntToStr(Size div 1024)+' GB'; Exit; end;
  //##,## TB
  if Size < 1024*1024*100 then begin Result :=
    N+FloatToStrF(Size/1024/1024, ffNumber, 4,2)+' TB'; Exit; end;
  //#### TB
  if Size < 1024*1024*1024 then begin Result :=
    N+IntToStr(Size div 1024 div 1024)+' TB'; Exit; end;
except
  Result := 'Fehler';
end;
end;

function ListDrives: TList;
var r: Integer; Drives: array[0..128] of char; pDrive: PChar; Tmp: TDrive;
begin
  Result := TList.Create;
  r := GetLogicalDriveStrings(SizeOf(Drives), Drives);
  if r = 0 then Exit;
  if r > SizeOf(Drives) then
    raise Exception.Create(SysErrorMessage(ERROR_OUTOFMEMORY));
  pDrive := Drives;
  while pDrive^ <> #0 do
  begin
    Tmp := TDrive.Create;
    Tmp.Caption := pDrive;
    Tmp.DriveType := GetDriveType(pDrive);
    Tmp.DriveChar := pDrive[0];
    Inc(pDrive, 4);
    Result.Add(Tmp);
  end;
end;

function GetDiskSize(Drive: Char): LongInt;
var Path: PChar; Free, T: Integer; Tmp: PInteger;
var RootPath: array[0..3] of Char; CD: String;
begin
  try
    CD := GetCurrentDir;
    SetCurrentDir(Drive + ':\');
    RootPath[0] := Drive;
    RootPath[1] := ':';
    RootPath[2] := '\';
    RootPath[3] := #0;
    Path := RootPath;
    T := 0;
    Tmp := @T;
    GetDiskFreeSpaceEx(Path, Free, Result, Tmp);
    SetCurrentDir(CD);
  except
    Result := -1;
  end;
end;

function GetDiskFree(Drive: Char): LongInt;
var Path: PChar; Size, T: Integer; Tmp: PInteger;
var RootPath: array[0..3] of Char; CD: String;
begin
  try
    CD := GetCurrentDir;
    SetCurrentDir(Drive + ':\');
    RootPath[0] := Drive;
    RootPath[1] := ':';
    RootPath[2] := '\';
    RootPath[3] := #0;
    Path := RootPath;
    T := 0;
    Tmp := @T;
    GetDiskFreeSpaceEx(Path, Result, Size, Tmp);
    SetCurrentDir(CD);
  except
    Result := -1;
  end;
end;


end.


Ich suche schon seit Stundan nach dem Fehler, vielleicht findet ihr ihn ja

Danke schonmal
JayEff
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2971

Windows Vista Ultimate
D7 Enterprise
BeitragVerfasst: Di 17.04.07 20:07 
Wo genau hast du die Unit FileExt her? :shock:

_________________
>+++[>+++[>++++++++<-]<-]<++++[>++++[>>>+++++++<<<-]<-]<<++
[>++[>++[>>++++<<-]<-]<-]>>>>>++++++++++++++++++.+++++++.>++.-.<<.>>--.<+++++..<+.
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: Di 17.04.07 20:36 
Kannst Du grob eine Methode eingrenzen, wo der Fehler auftritt?

_________________
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.
Yogu Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2598
Erhaltene Danke: 156

Ubuntu 13.04, Win 7
C# (VS 2013)
BeitragVerfasst: Mi 18.04.07 15:23 
Also, FileExt ist die Unit, in der ich meine Dateierweiterten Funktionen gespeichert habe und die ist nur noch aus versehen eningebunden, ich hab die nötigen Funktinoen in den Quelltext übernommen.

Eingrenzen kann ich das kanze kaum, dieser Quellcode ist nur ein Teil vom eigentlichen riesigen Projekt.
Auf jeden Fall tritt der Fehler nicht in FileSizeToStr auf, der Fehler passiert auch mit StrToInt.