| Autor |
Beitrag |
Yogu
      
Beiträge: 2598
Erhaltene Danke: 156
Ubuntu 13.04, Win 7
C# (VS 2013)
|
Verfasst: 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
      
Beiträge: 417
Erhaltene Danke: 2
XP
FPC mit Lazarus
|
Verfasst: 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
      
Beiträge: 2971
Windows Vista Ultimate
D7 Enterprise
|
Verfasst: 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
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  ), dann wird kein weißes Feld um den Code gelegt so wie hier in diesem beispiel (and or procedure ! toll! ) deutlich ersichtlich ist. 
_________________ >+++[>+++[>++++++++<-]<-]<++++[>++++[>>>+++++++<<<-]<-]<<++
[>++[>++[>>++++<<-]<-]<-]>>>>>++++++++++++++++++.+++++++.>++.-.<<.>>--.<+++++..<+.
|
|
Yogu 
      
Beiträge: 2598
Erhaltene Danke: 156
Ubuntu 13.04, Win 7
C# (VS 2013)
|
Verfasst: 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:
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 if Size < 0 then begin N := '-'; Size := -Size; end else N := ''; if Size < 1024 then begin Result := N+IntToStr(Size)+' Byte'; Exit; end; if Size < 1024*100 then begin Result := N+FloatToStrF(Size / 1024, ffNumber, 4,2)+' KB'; Exit; end; if Size < 1024*1024 then begin Result := N+IntToStr(Size div 1024)+' KB'; Exit; end; if Size < 1024*1024*100 then begin Result := N+FloatToStrF(Size/1024/1024, ffNumber, 4,2)+' MB'; Exit; end; if Size < 1024*1024*1024 then begin Result := N+IntToStr(Size div 1024 div 1024)+' MB'; Exit; end; Size := Size div 1024 div 1024; if Size < 1024*100 then begin Result := N+FloatToStrF(Size/1024, ffNumber, 4,2)+' GB'; Exit; end; if Size < 1024*1024 then begin Result := N+IntToStr(Size div 1024)+' GB'; Exit; end; if Size < 1024*1024*100 then begin Result := N+FloatToStrF(Size/1024/1024, ffNumber, 4,2)+' TB'; Exit; end; 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
      
Beiträge: 417
Erhaltene Danke: 2
XP
FPC mit Lazarus
|
Verfasst: Mo 16.04.07 18:29
JayEff, stay cool
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
      
Beiträge: 2088
|
Verfasst: 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 
      
Beiträge: 2598
Erhaltene Danke: 156
Ubuntu 13.04, Win 7
C# (VS 2013)
|
Verfasst: 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
      
Beiträge: 2088
|
Verfasst: 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
      
Beiträge: 8721
Erhaltene Danke: 191
Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
|
Verfasst: 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 
_________________ 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 
      
Beiträge: 2598
Erhaltene Danke: 156
Ubuntu 13.04, Win 7
C# (VS 2013)
|
Verfasst: Di 17.04.07 19:56
So, sieht ja ganzu gut aus, der Nachteil ist, dass nix klappt. Hier irgendwo ist ein Zugriffsverletzungs-Fehler:
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 public end;
var Form1: TForm1;
function FileSizeToStr(Size: Integer): String;
function ListDrives: TList;
function GetDiskSize(Drive: Char): LongInt;
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 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 if Size < 0 then begin N := '-'; Size := -Size; end else N := ''; if Size < 1024 then begin Result := N+IntToStr(Size)+' Byte'; Exit; end; if Size < 1024*100 then begin Result := N+FloatToStrF(Size / 1024, ffNumber, 4,2)+' KB'; Exit; end; if Size < 1024*1024 then begin Result := N+IntToStr(Size div 1024)+' KB'; Exit; end; if Size < 1024*1024*100 then begin Result := N+FloatToStrF(Size/1024/1024, ffNumber, 4,2)+' MB'; Exit; end; if Size < 1024*1024*1024 then begin ShowMessage(N+IntToStr(Size div 1024 div 1024)+' MB'); Exit; end; Size := Size div 1024 div 1024; if Size < 1024*100 then begin Result := N+FloatToStrF(Size/1024, ffNumber, 4,2)+' GB'; Exit; end; if Size < 1024*1024 then begin Result := N+IntToStr(Size div 1024)+' GB'; Exit; end; if Size < 1024*1024*100 then begin Result := N+FloatToStrF(Size/1024/1024, ffNumber, 4,2)+' TB'; Exit; end; 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
      
Beiträge: 2971
Windows Vista Ultimate
D7 Enterprise
|
Verfasst: Di 17.04.07 20:07
Wo genau hast du die Unit FileExt her? 
_________________ >+++[>+++[>++++++++<-]<-]<++++[>++++[>>>+++++++<<<-]<-]<<++
[>++[>++[>>++++<<-]<-]<-]>>>>>++++++++++++++++++.+++++++.>++.-.<<.>>--.<+++++..<+.
|
|
BenBE
      
Beiträge: 8721
Erhaltene Danke: 191
Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
|
Verfasst: 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 
      
Beiträge: 2598
Erhaltene Danke: 156
Ubuntu 13.04, Win 7
C# (VS 2013)
|
Verfasst: 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.
|
|
|