Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien
Toon posts:

[C#] GetFreeDiskSpaceEx

Pagina: 1
Acties:

Verwijderd

Topicstarter
Hey,

Ik ben momenteel bezig met een programma waarin ik de gebruikte en totale grootte van mijn C-partitie van mijn harde schijf wil ophalen. Hiervoor maak ik gebruik van de daarvoor voorziene API. Helaas krijg ik altijd 0 en False terug. Heeft er iemand al ervaring met deze API en kan je mij dan even helpen?

Dit is de declaratie:
C#:
1
2
3
4
5
6
[DllImport("kernel32.dll", EntryPoint = "GetDiskFreeSpaceExA")]
private extern static bool GetDiskFreeSpaceEx(
[MarshalAs(UnmanagedType.LPTStr)] string lpDirectoryName,
ref long lpFreeBytesAvailableToCaller,
ref long lpTotalNumberOfBytes,
ref long lpTotalNumberOfFreeBytes);


En met deze code roep ik de API aan:
C#:
1
2
3
4
5
6
7
8
9
10
bool rc;
long FreeBytesAvailable = new long();
long TotalNumberOfBytes = new long();
long TotalNumberOfFreeBytes = new long();
String ss = "C:\\";
rc = GetDiskFreeSpaceEx(ss, ref FreeBytesAvailable, ref
TotalNumberOfBytes, ref TotalNumberOfFreeBytes);
Debug.WriteLine("DISK: " + ss + " " + rc + " " +
FreeBytesAvailable + " " + TotalNumberOfBytes + " " +
TotalNumberOfFreeBytes);


Alvast bedankt!

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Waarom maak je niet gewoon gebruik van de DriveInfo class

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Verwijderd

Of van Performance Counters

  • Gurbe de n00b
  • Registratie: Juni 2003
  • Laatst online: 08-02-2024
Performance Counters is imo nogal overkill. De performance counter is een vrij zware service.

Portfolio


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 19-11 23:43

.oisyn

Moderator Devschuur®

Demotivational Speaker

Logisch. Hoe kom je aan die declaratie? Want wellicht wil je de documentatie nog even lezen, en dan specifiek het stukje over UnmanagedType.LPTStr:
LPTStr A platform-dependent character string: ANSI on Windows 98 and Unicode on Windows NT and Windows XP.
En dat terwijl je specifiek voor de ANSI versie van GetDiskFreeSpaceEx() kiest ("GetDiskFreeSpaceExA"). Je moet 'm dus marshallen als LPStr.

Maar ik zou gewoon voor de unicode versie gaan ("GetDiskFreeSpaceExW", en 'm dus ook marshallen als LPWStr), aangezien strings in C# ook unicode zijn en de ANSI versie op NT platforms toch al geimplementeerd is door een conversie naar unicode te doen en de unicode variant aan te roepen (waardoor je dus een dubbele conversie krijgt: van unicode naar ansi tijdens het marshallen, en dan weer naar unicode in de implementatie van GetDiskFreeSpaceExA).

Dit nog even naast het feit dat de classes uit het .Net framework die hiervoor bedoeld zijn (System.IO.DriveInfo, zoals rwb al aangaf) waarschijnlijk het handigst zijn om te gebruiken. Als je dat in eerste instantie al gedaan had, dan had je ook niet alle mogelijke problemen met marshalling op je hals gehaald ;)

[ Voor 49% gewijzigd door .oisyn op 28-03-2008 11:20 ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.