Visual C - Datei kopieren?

Fragen zu allen anderen Programmiersprachen.
Benutzeravatar
Mok
BotHunter
Beiträge: 1484
Registriert: 26.12.2005 14:14
Computerausstattung: MSI GX780R
Intel Core i5-2410M
Nvidia GT 555M
Windows 7 Home Premium 64 bit
Wohnort:   

Visual C - Datei kopieren?

Beitrag von Mok »

Hallo.
Ich versuche gerade in Visual C eine einfache Funktion namens FileCopy zu implementieren (Name ist Programm). Ich bin schon soweit, dass die Datei erstellt wird, allerdings schaffe ich es nicht, den Dateiinhalt hineinzuschreiben.

Code: Alles auswählen

BOOL FileCopy(char *src, char *dst)
{	
	HANDLE hSrc, hDst;
    LPDWORD lpSize = (LPDWORD)0;

	hSrc = CreateFileA((LPCSTR)src,GENERIC_READ,0,NULL,OPEN_EXISTING,0,NULL);
	if (hSrc == INVALID_HANDLE_VALUE)
	{	PrintLastError();
		Printf(src);
		return FALSE;
	}

	hDst = CreateFileA((LPCSTR)dst,GENERIC_WRITE,0,NULL,CREATE_ALWAYS,128,NULL);
    if (hDst == INVALID_HANDLE_VALUE)
    {   PrintLastError();
		Printf(dst);
        return FALSE;
    }

	GetFileSize(hSrc,lpSize);

	if (ReadFile(hSrc,stdin,128,lpSize,NULL))
	{
        if(WriteFile(hDst,stdout,128,lpSize,NULL))
        {   Printf("File copied successfully.\nPress ENTER to exit . . .");
	        return TRUE;
        } else {
            PrintLastError();
            return FALSE;
        }
	} else {
        PrintLastError();
        return FALSE;
    }
}
Was mache ich falsch?

Gruß, Mok.
Win 7 Home Premium 64 bit | PureBasic 5.20 - x86 und x86-64 | Firefox [aktuelle stable-Version hier einfügen]
"Jeder macht irgendwann mal Fehler, darum gibt's auch Bleistifte mit Radiergummi." --Carl
Benutzeravatar
milan1612
Beiträge: 810
Registriert: 15.04.2007 17:58

Re: Visual C - Datei kopieren?

Beitrag von milan1612 »

Mok hat geschrieben:

Code: Alles auswählen

GetFileSize(hSrc,lpSize);
Erwartet GetFileSize nicht einen Pointer als 2. Parameter? Probier mal &lpSize statt nur lpSize...

EDIT:

Code: Alles auswählen

DWORD dwFileSize;
dwFileSize = GetFileSize(hFile,  NULL);
Dokumentationen sind dafür da gelesen zu werden: http://msdn.microsoft.com/en-us/library ... S.85).aspx
Bin nur noch sehr selten hier, bitte nur noch per PN kontaktieren
Benutzeravatar
Mok
BotHunter
Beiträge: 1484
Registriert: 26.12.2005 14:14
Computerausstattung: MSI GX780R
Intel Core i5-2410M
Nvidia GT 555M
Windows 7 Home Premium 64 bit
Wohnort:   

Re: Visual C - Datei kopieren?

Beitrag von Mok »

milan1612 hat geschrieben:

Code: Alles auswählen

DWORD dwFileSize;
dwFileSize = GetFileSize(hFile,  NULL);
Das hab ich ausch schon probiert... erfolglos

Code: Alles auswählen

BOOL FileCopy(char *src, char *dst)
{	
	HANDLE hSrc, hDst;
    DWORD dwSize = (DWORD)0;

	hSrc = CreateFileA((LPCSTR)src,GENERIC_READ,0,NULL,OPEN_EXISTING,0,NULL);
	if (hSrc == INVALID_HANDLE_VALUE)
	{	PrintLastError();
		Printf(src);
		return FALSE;
	}

	hDst = CreateFileA((LPCSTR)dst,GENERIC_WRITE,0,NULL,CREATE_ALWAYS,128,NULL);
    if (hDst == INVALID_HANDLE_VALUE)
    {   PrintLastError();
		Printf(dst);
        return FALSE;
    }

	dwSize = GetFileSize(hSrc,NULL);

	if (ReadFile(hSrc,stdin,dwSize,NULL,NULL))
	{
        if(WriteFile(hDst,stdin,dwSize,NULL,NULL))
        {   Printf("File copied successfully.\nPress ENTER to exit . . .");
	        return TRUE;
        } else {
            PrintLastError();
            return FALSE;
        }
	} else {
        PrintLastError();
        return FALSE;
    }
}
milan1612 hat geschrieben:Dokumentationen sind dafür da gelesen zu werden: http://msdn.microsoft.com/en-us/library ... S.85).aspx
[/quote]
Ach wirklich? Was nutzt es mir, die Doku zu lesen (ich hab sie als Offline-MSDN Lib), wenn es so und so nicht funzt?
Win 7 Home Premium 64 bit | PureBasic 5.20 - x86 und x86-64 | Firefox [aktuelle stable-Version hier einfügen]
"Jeder macht irgendwann mal Fehler, darum gibt's auch Bleistifte mit Radiergummi." --Carl
Benutzeravatar
milan1612
Beiträge: 810
Registriert: 15.04.2007 17:58

Re: Visual C - Datei kopieren?

Beitrag von milan1612 »

Auch so sind da noch mehrere Fehler drin, das war nur das was mir zuerst aufgefallen ist.

Code: Alles auswählen

ReadFile(hSrc,stdin,dwSize,NULL,NULL)
Du ließt hier die Daten nach stdin ein. Das kann schon mal nicht funktionieren, denn stdin ist
selbst ein input device. Du solltest vor ReadFile einen dynamischen Buffer mit dwSize allozieren
und den dann als Inputbuffer übergeben.

Code: Alles auswählen

WriteFile(hDst,stdin,dwSize,NULL,NULL)
Hier das selbe, übergib deinen eigenen Buffer in dem nach ReadFile die Daten stehen...


EDIT: Ach noch was, warum verwendest du nicht gleich CopyFile?
Bin nur noch sehr selten hier, bitte nur noch per PN kontaktieren
Benutzeravatar
Mok
BotHunter
Beiträge: 1484
Registriert: 26.12.2005 14:14
Computerausstattung: MSI GX780R
Intel Core i5-2410M
Nvidia GT 555M
Windows 7 Home Premium 64 bit
Wohnort:   

Re: Visual C - Datei kopieren?

Beitrag von Mok »

milan1612 hat geschrieben:Du solltest vor ReadFile einen dynamischen Buffer mit dwSize allozieren.
Wie geht das? Mit void *buffer = (void *)Malloc(dwSize,sizeof(dwSize),NULL,0); hätt' ich's schon probiert -_-
milan1612 hat geschrieben:Ach noch was, warum verwendest du nicht gleich CopyFile?
Ich will mein (nicht vorhandenes) Können ausbauen, und dachte, ich fang mal einfach an, aber scheinbar ist 'einfach' noch ein bisschen zu schwierig :(
Win 7 Home Premium 64 bit | PureBasic 5.20 - x86 und x86-64 | Firefox [aktuelle stable-Version hier einfügen]
"Jeder macht irgendwann mal Fehler, darum gibt's auch Bleistifte mit Radiergummi." --Carl
Benutzeravatar
gnasen
Beiträge: 578
Registriert: 01.08.2007 14:28
Computerausstattung: PB 4.60

Re: Visual C - Datei kopieren?

Beitrag von gnasen »

Mok hat geschrieben:Ich will mein (nicht vorhandenes) Können ausbauen, und dachte, ich fang mal einfach an, aber scheinbar ist 'einfach' noch ein bisschen zu schwierig :(
Das Problem kenne ich, als ich in der Uni einen C-Kurs belegt hatte. Selbst einfachste Sachen scheinen mir in C unglaublich kompliziert. Letztens hatte ich zum konvertieren von ein paar Dateien ein PB programm geschrieben, war in wenigen Minuten getan. Meinem Mitstudenten (welcher c++ nutzt) sind fast die Augen aus dem Kopf gefallen, so schön kurz, sauber und bündig ging das mit PB.
Auch wenn C noch so mächtig ist (und ich denke mal das stellt wirklich keiner in Frage), schön ist es nicht ;)
pb 4.51
Benutzeravatar
Mok
BotHunter
Beiträge: 1484
Registriert: 26.12.2005 14:14
Computerausstattung: MSI GX780R
Intel Core i5-2410M
Nvidia GT 555M
Windows 7 Home Premium 64 bit
Wohnort:   

Re: Visual C - Datei kopieren?

Beitrag von Mok »

Wie geht das jetzt mit dem Buffer...?
Win 7 Home Premium 64 bit | PureBasic 5.20 - x86 und x86-64 | Firefox [aktuelle stable-Version hier einfügen]
"Jeder macht irgendwann mal Fehler, darum gibt's auch Bleistifte mit Radiergummi." --Carl
Benutzeravatar
milan1612
Beiträge: 810
Registriert: 15.04.2007 17:58

Re: Visual C - Datei kopieren?

Beitrag von milan1612 »

gnasen hat geschrieben:
Mok hat geschrieben:Ich will mein (nicht vorhandenes) Können ausbauen, und dachte, ich fang mal einfach an, aber scheinbar ist 'einfach' noch ein bisschen zu schwierig :(
Das Problem kenne ich, als ich in der Uni einen C-Kurs belegt hatte. Selbst einfachste Sachen scheinen mir in C unglaublich kompliziert. Letztens hatte ich zum konvertieren von ein paar Dateien ein PB programm geschrieben, war in wenigen Minuten getan. Meinem Mitstudenten (welcher c++ nutzt) sind fast die Augen aus dem Kopf gefallen, so schön kurz, sauber und bündig ging das mit PB.
Auch wenn C noch so mächtig ist (und ich denke mal das stellt wirklich keiner in Frage), schön ist es nicht ;)
Das Problem ist, dass das was ihr so schwer findet eigentlich nur die plattform-spezifischen APIs sind. C und C++ kann
man nun mal nicht mit z.B. Purebasic vergleichen, da es eben nur nackte Sprachen mit minimalen Standard Libraries
sind. Das ist der große Vorteil, denn dann ist das ganze nämlich ziemlich einfach auf andere Plattformen zu portieren...
Mok hat geschrieben:Wie geht das jetzt mit dem Buffer...?

Code: Alles auswählen

void* buffer = malloc(dwSize);
Bin nur noch sehr selten hier, bitte nur noch per PN kontaktieren
Benutzeravatar
Mok
BotHunter
Beiträge: 1484
Registriert: 26.12.2005 14:14
Computerausstattung: MSI GX780R
Intel Core i5-2410M
Nvidia GT 555M
Windows 7 Home Premium 64 bit
Wohnort:   

Re: Visual C - Datei kopieren?

Beitrag von Mok »

milan1612 hat geschrieben:

Code: Alles auswählen

void* buffer = malloc(dwSize);
Die Datei bleibt noch immer leer...
Win 7 Home Premium 64 bit | PureBasic 5.20 - x86 und x86-64 | Firefox [aktuelle stable-Version hier einfügen]
"Jeder macht irgendwann mal Fehler, darum gibt's auch Bleistifte mit Radiergummi." --Carl
Benutzeravatar
milan1612
Beiträge: 810
Registriert: 15.04.2007 17:58

Re: Visual C - Datei kopieren?

Beitrag von milan1612 »

Also Mok, wenn du wirklich C++ lernen willst, dann solltest du dich möglichst bald von den
Plattform APIs verabschieden und dich mit den Standard Libraries beschäftigen.

Ich hab mal schnell eine FileCopy Funktion in reinem C++ geschrieben, also ohne Hilfe der
Windows API. Diesen Code könntest du jetzt auf allen Plattformen verwenden, die einen
standard-konformen C++ Compiler bereitstellen.

Code: Alles auswählen

#include <fstream>
#include <string>
#include <vector>
#include <iostream>

bool copyFile(const std::string& source, const std::string& destination) {
    std::ifstream input(source.c_str(), std::ios_base::in | std::ios_base::binary);
    std::ofstream output(destination.c_str(), std::ios_base::out | std::ios_base::binary);
    
    if (!input.is_open() || !output.is_open())
        return false;
        
    input.seekg(0, std::ios::end);
    size_t size = input.tellg();
    input.seekg(0, std::ios::beg);
    
    std::vector<char> buffer;
    
    if (size > buffer.max_size())
        return false;
    
    buffer.reserve(size);
    
    input.read(&buffer[0], size);
    output.write(&buffer[0], size);
    
    return true;
}

int main() {
    std::cout << copyFile("file.txt", "copy_of_file.txt") ? "Success" : "Failed" << std::endl;
    return 0;
}
Der Code verwendet ein paar C++ Idioms, also frag einfach wenn du was nicht verstehst.



EDIT: Wenn du wirklich unbedingt die Windows API verwenden willst, findest du hier ein
Beispiel das ungefähr das macht was du machen willst: http://www.rohitab.com/discuss/topic/24 ... itefile-c/
Bin nur noch sehr selten hier, bitte nur noch per PN kontaktieren
Antworten