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![]()
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![]()
Imparare è un'esperienza, tutto il resto è solo informazione. (Albert Einstein)
ti da quello totale e libero (quello occupato te lo ricavi)
GetDiskFreeSpaceEx
DYNAMIC+ [ E-mail ]
Secondo me non si può fare!
grazie mille![]()
![]()
Imparare è un'esperienza, tutto il resto è solo informazione. (Albert Einstein)
ho trovato delle info è ho fatto un codice come questo:
ho provato a leggere un due veriabili ma non mi danno l'info che vedo io, quele sarebbe la variabile da leggere?codice:DWORD dwSectorsPerCluster; DWORD dwBytesPerSector; DWORD dwNumberOfFreeClusters; DWORD dwTotalNumberOfClusters; GetDiskFreeSpace("C:\\", &dwSectorsPerCluster, &dwNumberOfFreeClusters, &dwNumberOfFreeClusters, &dwTotalNumberOfClusters);
Io ho pensato di dover ricavare facendo
dwSectorsPerCluster*dwNumberOfFreeClusters*dwNumbe rOfFreeClusters
ma da un valore errato.
![]()
Imparare è un'esperienza, tutto il resto è solo informazione. (Albert Einstein)
Allora:
codice:TotalSpace = dwTotalNumberOfClusters * dwSectorsPerCluster * dwBytesPerSector; FreeSpace = dwNumberOfFreeClusters * dwSectorsPerCluster * dwBytesPerSector; UsedSpace = TotalSpace - FreeSpace;
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
![]()
![]()
Imparare è un'esperienza, tutto il resto è solo informazione. (Albert Einstein)
usa GetDiskFreeSpaceEx e non GetDiskFreeSpace, insomma la versione Extended, perche' quella retrocompatibile con NT3.51, bhe fi ferma a 2Gb di capacita' massima
DYNAMIC+ [ E-mail ]
Secondo me non si può fare!
Ah, vero... anche prima avevi scritto la versione extended!![]()
Durante le ricerche su come implementare ho perso un pezzo![]()
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:
quando faccio il test concodice:unsigned __int64 getFreeSpace() { __int64 freeSpace, totalSpace, totalFreeSpace; GetDiskFreeSpaceEx( "C:\\", (PULARGE_INTEGER) freeSpace, (PULARGE_INTEGER) totalSpace, (PULARGE_INTEGER) totalFreeSpace); return freeSpace; }
dice che << è ambiguo.codice:ofstream a("a.txt"); a << getFreeSpace();
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.
![]()
Imparare è un'esperienza, tutto il resto è solo informazione. (Albert Einstein)
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;
DYNAMIC+ [ E-mail ]
Secondo me non si può fare!
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ì:
codice:... 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); ...
codice:... 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![]()
Imparare è un'esperienza, tutto il resto è solo informazione. (Albert Einstein)