windows - Hvad er den hurtigste måde at oprette 1 GB fil fyldt med nuller i C/C ++?

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg skal oprette en stor binær fil fyldt med nuller i Windows OS. Dens størrelse er givet. Hvad er den mest effektive måde at gøre det i C/C ++?

Bedste reference


Prøv at ringe til truncate(2):


truncate("/my/file", my\_size);


For mere information,


man 2 truncate



  Funktionerne truncate () og ftruncate () forårsager, at den almindelige fil, der er navngivet af sti eller refereres af fd, skal afkortes til en størrelse af præcis længdebytes.

  
  Hvis filen tidligere var større end denne størrelse, går de ekstra data tabt. Hvis filen tidligere var kortere, forlænges den, og den udvidede del læser som nullbyte ('\ 0').



Hvis du leder efter den indbyggede Windows-funktion, skal du kigge på SetEndOfFile, hvilket gør det samme. [6]

Andre referencer 1


Hvis filen virkelig skal være alle nuller, så er der ingen anden måde end at skrive alle dataene. Jeg ville nok gøre det ved hjælp af en buffer af samme størrelse som drevblokstørrelsen, og skriv den i en loop, indtil du skriver til den ønskede størrelse.


Hvis filen kan indeholde 'huller', hvor dataene er udefinerede (hvad er der allerede på disken) kan du søge efter den angivne størrelse og skrive en enkelt byte.

Andre referencer 2


'Hurtigste' er platformafhængig. På unix skal du bruge åbne og skrive systemopkald; Sørg for at kalde skriv med en stor buffer (~ 1 MB).

Andre referencer 3


Hvis nogen undrer mig over, hvordan jeg har løst mit problem her:


void CreateBlankFile(LPSTR str, long lsize) {
    DWORD dwErr;
    HANDLE file = CreateFile(str, 
                             GENERIC\_WRITE,
                             FILE\_SHARE\_WRITE,
                             NULL,
                             CREATE\_ALWAYS,
                             FILE\_ATTRIBUTE\_NORMAL,
                             NULL);
    dwErr = GetLastError();
    if (dwErr > 0) {
        //some error message should be here
        return;
    }
    SetFilePointer(file, lsize, 0, FILE\_BEGIN);
    SetEndOfFile(file);
    CloseHandle(file);
}

Andre referencer 4


Måske er det, hvad du leder efter, SPARSE fil. Disse typer af filer er generelt lavet af fildelingsprogrammer ...


http://www.flexhex.com/docs/articles/sparse-files.phtml[7]