Seite 1 von 2
Visual C - Datei kopieren?
Verfasst: 19.09.2010 12:00
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.
Re: Visual C - Datei kopieren?
Verfasst: 19.09.2010 12:23
von milan1612
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
Re: Visual C - Datei kopieren?
Verfasst: 19.09.2010 12:36
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;
}
}
[/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?
Re: Visual C - Datei kopieren?
Verfasst: 19.09.2010 12:43
von milan1612
Auch so sind da noch mehrere Fehler drin, das war nur das was mir zuerst aufgefallen ist.
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.
Hier das selbe, übergib deinen eigenen Buffer in dem nach ReadFile die Daten stehen...
EDIT: Ach noch was, warum verwendest du nicht gleich
CopyFile?
Re: Visual C - Datei kopieren?
Verfasst: 19.09.2010 13:21
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

Re: Visual C - Datei kopieren?
Verfasst: 19.09.2010 13:31
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

Re: Visual C - Datei kopieren?
Verfasst: 19.09.2010 14:08
von Mok
Wie geht das jetzt mit dem Buffer...?
Re: Visual C - Datei kopieren?
Verfasst: 19.09.2010 14:22
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...?
Re: Visual C - Datei kopieren?
Verfasst: 19.09.2010 14:30
von Mok
milan1612 hat geschrieben:
Die Datei bleibt noch immer leer...
Re: Visual C - Datei kopieren?
Verfasst: 19.09.2010 14:46
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/