Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (WinAPI, Konsole) » Dateien über 700 Bm kopieren ??

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 < [ 2 ]
000
12.09.2003, 08:34 Uhr
~erlanger24
Gast


Ich verwende zum kopieren folgende Funktion:


C++:
int fcopy(const char *from_name, const char *to_name)
{
    FILE *from, *to;
    char buf[1024]; /* wir schreiben Kilobyteweise */
    double len;

    if((from = fopen(from_name, "r")) == NULL)
        return -1;
    if((to = fopen(to_name, "w")) == NULL)
    {
        fclose(from);
        return -1;
    }
    while(!feof(from))
    {
        len = fread(buf, sizeof(char), 1024, from);
        AfxMessageBox(len/1024);
        if((len <= 0 && !feof(from)) || fwrite(buf, sizeof(char), len, to) <= 0)
        { /* Fehler */
            fclose(from);
            fclose(to);
            return -1;
        }
    }

    fclose(from);
    fclose(to);

    return 0;        
}


Wenn ich damit aber ne Datei kopiere die sagen wir 700 MB hat häght sich das Programm und der explorer auf !

Kann mir jemand sagen woran das liegt ? und was ich verbessern muß ?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
12.09.2003, 08:55 Uhr
virtual
Sexiest Bit alive
(Operator)


Was mir so auffällt:
1. Die Größe von buf kannst Du größer wählen. Man kann so 4096, 8192 Bytes als Buffergroöße nehmen, also etwas, was sich an der Blockgröße der Platte orientiert, ist natürlich Systemabh.

2. Du öffnest Die Datei nicht im Binärmode. Das mact unter Windows einen Unterschied, nimm also besser "rb" resp. "wb" als Openmode beim fopen.

3. Es gibt keinen Vernünftigen Grund len als double zu deklarieren, nimm doch das, was das API dir vorschlägt: size_t, ist ein netter kleiner Integer.

4. das hier

C++:
if((len <= 0 && !feof(from)) || fwrite(buf, sizeof(char), len, to) <= 0)
{
   /* Fehler */
    ...
}


Ist IMHO fehlerhaft. Wie wäre es mit:

C++:
if((len>0 && len!=fwrite(buf, sizeof(char), len, to))
{
   /* Fehler beim schreiben */
   ....
}else if (len!=sizeof(buf) && !feof(from))
{
   /* Fehler beim lesen */
   ....
}


Wobei man im letzten If zweig naturgemäß ein break machen würde und ausserhalb der umgebenden while-Schleife auf Fehler im inout Handle from testen würde.
--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)

Dieser Post wurde am 12.09.2003 um 08:56 Uhr von virtual editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
12.09.2003, 15:18 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


ich würde auch das array mind 1 größer nehmen, da sonst die terminierende Null nicht mehr reinpasst, das hat bei mir früher bei so einer routine probleme bereitet
--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
12.09.2003, 15:47 Uhr
virtual
Sexiest Bit alive
(Operator)


Wo soll denn die terminierende Null herkommen?
--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
12.09.2003, 16:33 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


hmm gute frage, aber wenn ichs nicht um 1 größer gemacht habe hat das bei mir immer irgendwie 1byte weniger aus der datei gelesen?!?
--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
12.09.2003, 16:37 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


war wahrscheinlich ein ascii 10 oder 13
--
...fleißig wie zwei Weißbrote
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
15.09.2003, 08:46 Uhr
~erlanger24
Gast


Hab euren rat umgesetzt ! Das Kopieren funktioniert jetzt auch ganz super aber ich hab noch das Problem das das Programm wärend des kopierens "tot" ist da es sich ja in einer schleife befindet und daher keinen neuen Bildaufbau macht .

Wie bekomme ich in dem Prog ne Statusanzeige hin ? Das der Anwender kein totes Programm hat ?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
15.09.2003, 15:53 Uhr
proga




Zitat:
FloSoft postete
hmm gute frage, aber wenn ichs nicht um 1 größer gemacht habe hat das bei mir immer irgendwie 1byte weniger aus der datei gelesen?!?
Du hast wahrscheinlich im ASCII-Mode gelesen, im BINARY-Mode gibt es keine Nullterminierung.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
15.09.2003, 16:10 Uhr
proga




Zitat:
~erlanger24 postete
Hab euren rat umgesetzt ! Das Kopieren funktioniert jetzt auch ganz super aber ich hab noch das Problem das das Programm wärend des kopierens "tot" ist da es sich ja in einer schleife befindet und daher keinen neuen Bildaufbau macht .

Wie bekomme ich in dem Prog ne Statusanzeige hin ? Das der Anwender kein totes Programm hat ?


Ich habe so etwas schon mal gemacht...

C++:
HWND hProgressBar;
/***************************************************************************
* Shows a progress bar while copying a file
*/

void ShowProgressBar(HWND hParentWindow)
{
    INITCOMMONCONTROLSEX    InitCtrls;

    InitCtrls.dwSize = sizeof(InitCtrls);
    InitCtrls.dwICC = ICC_PROGRESS_CLASS;

    char Text[50] = "Copy file ";
    strcat(Text, chFNDest);
    strcat(Text, " to Drive A: . . .");

    BOOL bResult = InitCommonControlsEx(&InitCtrls);
    hProgressBar = CreateWindowEx(
        WS_EX_APPWINDOW | WS_EX_TOPMOST,        // DWORD dwExStyle,            // extended window style
        PROGRESS_CLASS,                            // LPCTSTR lpClassName,        // registered class name
        Text,                                    // LPCTSTR lpWindowName,    // window name
        WS_CAPTION /*| WS_POPUPWINDOW*/ /*| WS_CHILD*/ | WS_VISIBLE,// | PBS_SMOOTH,
        300,                                    // int x,                    // horizontal position of window
        300,                                    // int y,                    // vertical position of window
        600,                                    // int nWidth,                // window width
        50,                                        // int nHeight,                // window height
        hParentWindow,                            // HWND hWndParent,            // handle to parent or owner window
        0,                                        // HMENU hMenu,                // menu handle or child identifier
        0,                                        // HINSTANCE hInstance,        // handle to application instance
        0                                        // LPVOID lpParam            // window-creation data
    );
    SendMessage(hProgressBar, PBM_SETRANGE, 0, MAKELPARAM(0, 100));
    SendMessage(hProgressBar, PBM_SETSTEP, (WPARAM) 1, 0);
}

DWORD WINAPI CopyThread(LPVOID lpThreadParameter)
{
    // hier den Code zum Kopieren und zum Senden von Nachrichten an die Scrollbar
}

// in main -> Datei kopieren
ShowProgressBar(NULL);
DWORD ThreadId = 0;
HANDLE hThread = CreateThread(NULL, NULL, CopyThread, NULL, NULL, &ThreadId);
do
{
    GetExitCodeThread(hThread, &ExitCode);

    MSG message;
    if (::PeekMessage(&message, hProgressBar, 0, 0, PM_REMOVE))
    {
        ::TranslateMessage(&message);
        ::DispatchMessage(&message);
    }
} while (ExitCode == STILL_ACTIVE);
CloseHandle(hThread);
hThread = NULL;
SendMessage(hProgressBar, WM_CLOSE, 0, 0);
hProgressBar = NULL;

Dieser Post wurde am 15.09.2003 um 16:27 Uhr von proga editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
15.09.2003, 16:44 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


Ich glaube nicht das das das ist was er wollte...
Ich würde einfach mit gotoxy aus der conio.h (oder falls der befehl bei deinem compiler nicht geht, mit den entsprechenden Escape Sequenzen oder unter VC mit den entsprechenden SetConsole*-Funktionen)
und dann folgendes:

- Größe der kopierenden Datei ermitteln = 100%
- dann immer beim kopieren eben cursor neu setzen, entsprechende Prozentzahl ausgeben.
--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 < [ 2 ]     [ C / C++ (WinAPI, Konsole) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: