PDA

Visualizza la versione completa : [C++ Api Win32] spazio totale, occupato e libero del disco fisso


netarrow
29-06-2005, 20:47
come da titolo, ho cercado su msdn o sulle references ma non riesco a trovare delle api che mi diano queste informazioni sul disco fisso.

Se qualcuno ha consigli mi fa un favore.


Grazie ciao :ciauz:

DYNAM!C+
29-06-2005, 21:08
ti da quello totale e libero (quello occupato te lo ricavi)


GetDiskFreeSpaceEx

netarrow
30-06-2005, 10:58
grazie mille :)

:ciauz:

netarrow
30-06-2005, 14:54
ho trovato delle info è ho fatto un codice come questo:



DWORD dwSectorsPerCluster;
DWORD dwBytesPerSector;
DWORD dwNumberOfFreeClusters;
DWORD dwTotalNumberOfClusters;

GetDiskFreeSpace("C:\\", &dwSectorsPerCluster,
&dwNumberOfFreeClusters,
&dwNumberOfFreeClusters,
&dwTotalNumberOfClusters);


ho provato a leggere un due veriabili ma non mi danno l'info che vedo io, quele sarebbe la variabile da leggere?
Io ho pensato di dover ricavare facendo

dwSectorsPerCluster*dwNumberOfFreeClusters*dwNumbe rOfFreeClusters

ma da un valore errato.

:ciauz:

pprllo
30-06-2005, 14:59
Allora:


TotalSpace = dwTotalNumberOfClusters * dwSectorsPerCluster * dwBytesPerSector;
FreeSpace = dwNumberOfFreeClusters * dwSectorsPerCluster * dwBytesPerSector;
UsedSpace = TotalSpace - FreeSpace;

netarrow
30-06-2005, 15:15
mi ritorna 2.147.155.968 ma io ho 4,87 G di spazio libero.

Come faccio a convertire nel valore corretto? Prima ho pensato che quello fosse il valore in bytes, ma in bytes ho 5.231.001.600 bytes

:confused:

:ciauz:

DYNAM!C+
30-06-2005, 15:34
usa GetDiskFreeSpaceEx e non GetDiskFreeSpace, insomma la versione Extended, perche' quella retrocompatibile con NT3.51, bhe fi ferma a 2Gb di capacita' massima

netarrow
30-06-2005, 16:47
Ah, vero... anche prima avevi scritto la versione extended! :dhò:

Durante le ricerche su come implementare ho perso un pezzo :D


Ora ho solo un ultimo problema di compatibilità dei tipi di dato sembra: l'operatore << non riesce a scrivere il formato ULARGE_INTEGER o __int64, provo vari cast ma non riconosce la conversione di tipo; mostro il codice:



unsigned __int64 getFreeSpace() {
__int64 freeSpace, totalSpace, totalFreeSpace;

GetDiskFreeSpaceEx( "C:\\", (PULARGE_INTEGER) freeSpace,
(PULARGE_INTEGER) totalSpace,
(PULARGE_INTEGER) totalFreeSpace);

return freeSpace;
}


quando faccio il test con



ofstream a("a.txt");
a << getFreeSpace();


dice che << è ambiguo.

Se faccio un cast con ULARGE_INTEGER non lo riconosce, riesco solo a castare in PULARGE_INTEGER che però essendo il puntatore ritorna l'indirizzo e se lo dereferenzio nuovamente l'errore di cast unsupported.

grazie a tutti per il vostro aiuto.


:ciauz:

DYNAM!C+
30-06-2005, 16:55
io farei cosi

struct QWORD
parentesi
DWORD loDword;
DWORD hiDword;
end-parentesi;


....

QWORD freeSpace, totalSpace, totalFreeSpace;

GetDiskFreeSpaceEx( "C:\\", (PULARGE_INTEGER) &freeSpace.....


ora dovresti poter fare il

cout << freeSpace.hiDword << freeSpace.loDword;

netarrow
30-06-2005, 22:48
non ci avevo pensato a fare una struttura in quel modo, effetivamente così stampa il tipo di dato anche l'operatore <<, il problema è che da dati sfasati, è colpa proprio di << sia su file sia su standard output su monitor(una message box neanche si visualizza).

Al momento ho dovuto fare un piccolo "sacrificio" e usare funzioni C in un programma C++, ma era previsto nel progetto usare anche C, ho fatto così:



...
FILE* file = fopen("a.txt", "w");

fprintf(file, "%I64d\n", getSpace(TOTAL));
fprintf(file, "%I64d\n", getSpace(USED));
fprintf(file, "%I64d\n", getSpace(FREE));

fclose(file);
...





...
const int FREE = 1;
const int TOTAL = 2;
const int USED = 3;
...
unsigned __int64 getSpace(int use) {

__int64 lpFreeBytesAvaibleToCaller, lpTotalNumberOfBytes, lpTotalNumberOfFreeBytes;

GetDiskFreeSpaceEx("C:\\", (PULARGE_INTEGER)&lpFreeBytesAvaibleToCaller,
(PULARGE_INTEGER) &lpTotalNumberOfBytes,
(PULARGE_INTEGER) &lpTotalNumberOfFreeBytes);


__int64 space = NULL;

switch(use) {
case FREE:
space = lpTotalNumberOfFreeBytes;
break;
case USED:
space = lpTotalNumberOfBytes - lpTotalNumberOfFreeBytes;
break;
case TOTAL:
space = lpTotalNumberOfBytes;
break;
}

return space;
}
...



grazie a tutti per l'aiuto :ciauz:

Loading