Datei zerteilen



  • Ich will eine Datei die bis zu 1 GB groß ist in kleiner Dateien mit ca. 1 MB zerlegen. Dazu habe ich zuerst einmal fstream verwedet, der aber ab gewissen größen anfängt zu streiken. Nun will ich Funktionen der Windows Api verwenden.
    Hab ReadFile das hier ausprobiert jedoch ist nachdem ich eine MP3 mit 2 MB einglesen habe in dem Buffer nur 5 Zeichen ("ID3/x0").
    Kann mir da jemand helfen?



  • Das liegt wahrscheinlich nur daran, weil du versuchst eine binäre Datei in der Konsole auszugeben. Schreib den Inhalt des Buffers mal in eine neue Datei.



  • Bei mir klappt das in etwa so:

    void fragmentate(char *FNIn, char *FNOut, long int FSize)
    {
      FILE *fpin,*fpout;
      const BuffSize=32768;
      char Buff[BuffSize];
      int i;
      int Blocks;
      int Files=0;
      char FNOut2[256];
      char FNNum[34];
      if ((fpin=fopen(FLB->FileName.c_str(),"rb"))!=NULL)
      {
        Files=0;
        while (!feof(fpin))
        {
          itoa(Files,FNNum,10);
          strcpy(FNOut2,FNOut);
          strcat(FNOut2,FNNum);
          if ((fpout=fopen(FNOut2,"wb"))!=NULL)
          {
            Blocks=0;
            if (BuffSize<=(FSize-BuffSize*Blocks))
              i=fread(Buff,1,BuffSize,fpin);
            else
              if ((FSize-BuffSize*Blocks)>0)
                i=fread(Buff,1,FSize-BuffSize*Blocks,fpin);
              else
                i=0;
            while (i>0)
            {
              Blocks++;
               fwrite(Buff,1,i,fpout);
               if (BuffSize<=(FSize-BuffSize*Blocks))
                i=fread(Buff,1,BuffSize,fpin);
               else
                if ((FSize-BuffSize*Blocks)>0)
                  i=fread(Buff,1,FSize-BuffSize*Blocks,fpin);
                else
                  i=0;
            }
            Files++;
            fclose(fpout);
          }
        }
        fclose(fpin);
      }
      else
      {
      }
    }
    

    Die Anpassung des Namens 'FNOut2' ist nicht getestet!!! Das war mal 'n Teil vom BCB!)



  • Das ich die binären Daten in die Console ausgebe - daran liegs wohl nicht, weil ich C++ Builder benutze. Im Debugger sehe ich auch nur 5 Zeichen.
    Ich bin nur hier im WinAPI Forum weil ich ja auch etwas größere Dateien splitten will was mit fread, fstream & TFileStream nicht geht.



  • Der Debugger zeigt es wahrscheinlich auch nicht an, weil das 5. Zeichen eine \0 ist. Probiers mal so aus. Das kopiert einfach eine mp3 Datei in eine neue Datei.

    #include <windows.h>
    #include <iostream>
    #include <fstream>
    
    int main() {
        // Datei öffnen
        HANDLE hFile = CreateFile(TEXT("1.mp3"), GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
        if(hFile == INVALID_HANDLE_VALUE) {
            std::cout << "Datei konnte nicht geöffnet werden!" << std::endl;
            return EXIT_FAILURE;
        }
    
        // Dateigröße ermitteln
        DWORD dwFileSize = GetFileSize(hFile, NULL);
    
        // Speicher für Buffer reservieren
        LPTSTR pszBuffer = new TCHAR[dwFileSize + 1];
    
        // Datei auslesen
        DWORD dwBytesRead = 0;
        ReadFile(hFile, pszBuffer, dwFileSize, &dwBytesRead, NULL);
        pszBuffer[dwBytesRead] = '\0';
    
        // Datei schließen
        CloseHandle(hFile);
    
        // Neue Datei schreiben
        DWORD dwBytesWritten = 0;
        HANDLE hNewFile = CreateFile(TEXT("2.mp3"), GENERIC_WRITE, FILE_SHARE_READ, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
        WriteFile(hNewFile, pszBuffer, dwBytesRead, &dwBytesWritten, NULL);
        CloseHandle(hNewFile);
    
        // Buffer freigeben
        delete[] pszBuffer;
    
        return EXIT_SUCCESS;
    }
    


  • Original erstellt von <UrPc>:
    Ich bin nur hier im WinAPI Forum weil ich ja auch etwas größere Dateien splitten will was mit fread, fstream & TFileStream nicht geht.

    Wiso soll das mit fread/ fwrite nicht gehen???

    Haste meine Funktion mal getestet? Bei mir geht das im BCB 4.0 auch mit sehr grossen Files. (Fuer Dateinamen kannste im BCB besser AnsiString nehmen. Ich hab damit schon einige grosse Dateien in zig' kleine zerhackt. Die lassen sich auch wieder zusammensetzen! Du musst die Datei nur im Binaermodus verarbeiten!



  • Danke jetzt klappts.
    @DerAltenburger Auf Dateien > 2-4GB lesend / schreibend zugreifen...
    schau mal hier. Außerdem ist die fread Methode langsamer.


Anmelden zum Antworten