Visualizzazione dei risultati da 1 a 7 su 7
  1. #1

    [C] Funzione per conoscere lo spazio LIBERO su disco

    Come da oggetto..

    Vorrei fare un micro programmino che crea un file GIGANTE fino a terminare lo spazio su disco, scrivendo dei dati ripetitivi..poi il file gigante verrebbe cancellato alla fine della scrittura..insomma un programmino per socrascrivere tutti i dati cancellati ma ancora presenti sull'hd e quindi recuperabili..

    Non ho problemi a fare un programma che crei un file, però vorrei crearlo grande quanto lo spazio libero disponibile sul disco (magari un po' di meno, sò che win si incacchia)

    Come posso fare ?

    Credo di dover usare GetDiskFreeSpaceEx ma non ho capito come utilizzarla faccio pasticci con i puntatori alle variabili ..sono ignorante sui puntatori

  2. #2
    Allora, la funzione delle API Win32 per sapere lo spazio libero su disco è la GetDiskFreeSpace che ti restituisce lo spazio disponibile come numero di cluster liberi e numero di byte per cluster.

    Il problema vero, però, è che non basta semplicemente sovrascivere lo spazio libero per aver cancellato le tracce di quel che c'era sul disco: con metodi sofisticati è possibile recuperare, sembra, fino a 4-6 valori precedenti dal disco rigido.

    Se vuoi che davvero sia irrecuperabile, c'è una particolare sequenza di riscritture che garantisce buoni risultati in tal senso, ma non saprei dirti quale sia, devi fare una ricerca sulla rete.

    Ciao!
    "Le uniche cose che sbagli sono quelle che non provi a fare."
    Atipica

  3. #3
    Se hai già fatto esperimenti, postali!
    "Le uniche cose che sbagli sono quelle che non provi a fare."
    Atipica

  4. #4
    Si si sono ben a conoscenza della memoria magnetica, in ambito governativo si sovrascrive 3 volte con 3 differenti dati e l'operazione viene ripetuta 18/20 volte...

    ma chi se ne frega :mavieni: io voglio fare qualcosa di casalingo !

    Cosa cacchio sbaglio qui (di sicuro un sacco di roba )?

    codice:
    #include <windows.h>
    #include <stdio.h>
    
    main () {
    
    int  dimensione;
    
    GetDiskFreeSpaceEx(NULL,NULL,NULL,&dimensione);
    
    printf ("Posso utilizzare %d bytes \n",dimensione);
    
    system("PAUSE");
    
    return 0;
    
    }
    8 C:\Programmi\Dev-Cpp\Spazio Rimasto\main.c
    [Warning] passing arg 4 of `GetDiskFreeSpaceExA' from incompatible pointer type

    e non capisco il perchè !

    L'argomento 4 : lpTotalNumberOfFreeBytes
    [out] Pointer to a variable that receives the total number of free bytes on the disk. mbè ?

    Se me ne frego e lo eseguo mi dice :

    Posso utilizzare 596365312 bytes
    Invece se vado sulle proprietà disco, tasto destro e mi dice : spazio disponibile : 69318824048 byte (molti di piu)

  5. #5
    Se, come in questo caso, una funzione delle API vuole come parametri 4 puntatori a 4 variabili, DEVI passargli 4 puntatori a 4 variabili, non puoi passargli delle costanti, MAI, nemmeno se gli passeresti null perchè non ti interessa il valore ritornato in quelle variabili; questo per quel che riguarda la regola generale.

    In alcuni casi, come questo, la funzione accetta un NULL su alcuni parametri che considera opzionali, ma tra questi non c'è affatto, nel tuo caso, il primo parametro, che è una stringa terminata con null che contiene il percorso alla cartella di cui vuoi sapere lo spazio libero.

    Qui

    http://msdn.microsoft.com/library/de...reespaceex.asp

    Trovi l'elenco esatto dei parametri restituiti/richiesti.

    Ciao!
    "Le uniche cose che sbagli sono quelle che non provi a fare."
    Atipica

  6. #6
    Ah, solo un altro appunto: un intero a 32 bit, come ben saprai, tiene valori fino a circa 4 miliardi, che sono circa 4 Gb.

    Il che significa che la funzione, così come tu la usi, non potrà mai restituirti il valore dello spazio libero quando questo è superiore a 4 Gb!

    Qui sotto uno spezzone dal sito MS che ti mostra che tipi di variabili usare!

    codice:
    #include <windows.h>
    #include <stdio.h>
    
    typedef BOOL (WINAPI *PGETDISKFREESPACEEX(LPCSTR,
       PULARGE_INTEGER, PULARGE_INTEGER, PULARGE_INTEGER);
    
    BOOL MyGetDiskFreeSpaceEx(LPCSTR pszDrive)
    {
       PGETDISKFREESPACEEX pGetDiskFreeSpaceEx;
       __int64 i64FreeBytesToCaller, i64TotalTypes, i64FreeBytes;
       DWORD dwSectPerClust, dwBytesPerSect, dwFreeClusters, dwTotalClusters;
       BOOL fResult;
    
       pGetDiskFreeSpaceEx = GetProcAddress( GetModuleHandle("kernel32.dll"),
                              "GetDiskFreeSpaceExA");
    
       if (pGetDiskFreeSpaceEx)
       {
          fResult = pGetDiskFreeSpaceEx (pszDrive,
                     (PULARGE_INTEGER)&i64FreeBytesToCaller,
                     (PULARGE_INTEGER)&i64TotalBytes,
                     (PULARGE_INTEGER)&i64FreeBytes);
    
       // Process GetDiskFreeSpaceEx results.
          printf("Total free bytes = %I64d\n", i64FreeBytes);
       }
    
       else 
       {
          fResult = GetDiskFreeSpace (pszDrive, 
                     &dwSectPerClust, 
                     &dwBytesPerSect,
                     &dwFreeClusters, 
                     &dwTotalClusters);
    
       // Process GetDiskFreeSpace results.
          printf("Total free bytes = I64d\n", 
                 dwFreeClusters*dwSectPerClust*dwBytesPerSect);
       }
    
    }
    RiCiao!
    "Le uniche cose che sbagli sono quelle che non provi a fare."
    Atipica

  7. #7
    Stavo giusto facendo
    Ecco il codice funzionante!

    codice:
    #include <windows.h>
    #include <stdio.h>
    
    main () {
    
    __int64 dimensione;
    float mega;
    float giga;
    float kilo;
    
    GetDiskFreeSpaceEx(NULL,NULL,NULL,(PULARGE_INTEGER)&dimensione);
    
    kilo = dimensione/1024;
    mega = kilo/1024;
    giga = mega/1024;
    
    printf ("Posso utilizzare %I64d byte \n",dimensione);
    printf ("Ovvero %0.0f mega o %0.1f giga \n",mega, giga);
    
    system("PAUSE");
    
    return 0;
    
    }
    Mi son anche ricordato che ME/9x non supportano files piu grandi di 4gb vero ? quindi la mia malsana idea di fare un super-mega-giga file di svariati gb non è felice su quei sistemi operativi su xp dite che da qualche problemino ? sennò c'è qualche magica funzione che mi fa scrivere su disco prograssivamente senza creare necessariamente un super-mega-giga file ?

    PS: il primo parametro può essere NULL e viene così inteso come campo di lavoro la root del disco sul quale ci si trova

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.