CreateFile-und alles was dazugehört
-
Hallo,
Ich möchte ein Programm schreiben, das eine Datei erstellt, mit ihr arbeitet und dann wieder beendet:
#include <windows.h> #include <iostream.h> int main(int argc, char* argv[]) { int dum; HANDLE hData=CreateFile("\\C:\\Test.txt",GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL); if (hData==((HANDLE)-1)) { cout<<"Fehler"; cin>>dum; } else { cout<<"Erfolg"; cin>>dum; } CloseHandle(hData); return 0; }Ist das von der Vorgehensweise her richtig, wie man die Datei öffnet und wieder beendet?
Danke im Voraus
Toddy
-
yup, wenn du mit CreateFile() arbeiten willst, dann sieht das vernünftig aus

-
Ne, sieht nicht vernünfitg aus...
1. Keine TCHAR-Macros... => _T
2. Was soll den der "\\" vor dem Dateinamen?
3. Warum machst Du ein "CloseHandle" wenn die Datei gar nicht geöffnet werden konnt?
4. Was ist denn "iostream.h" ?
-
Hallo Jochen Kalmbach,
1. Das müsstest du mir mal genauer erklären, das klingt wichtig...
2. Das war jetzt nur ein Beispiel (eigentlich wollte ich ein Gerät ansprechen...), aber es geht eigentlich nur grundsätzlich um die Sache mit dem CreateFile() usw...
3. Ja stimmt eigentlich hätte ich das in das else reinbauen müssen
4. iostream.h ist die Header-Datei für die Funktionen cin und cout, es gibt auch andere Möglichkeiten, aber darum gehts eigentlich auch nicht...MFG Toddy
-
Jochen Kalmbach schrieb:
Ne, sieht nicht vernünfitg aus...
1. Keine TCHAR-Macros... => _T
2. Was soll den der "\\" vor dem Dateinamen?
3. Warum machst Du ein "CloseHandle" wenn die Datei gar nicht geöffnet werden konnt?
4. Was ist denn "iostream.h" ?1. weil es hier nicht darum geht, deiner ansicht nach sauberen code darzustellen
2. ist vollkommen irrelevant in bezug auf toddys fragestellung
3. ist zwar richtig, dennoch schadet ein CloseHandle() auf ein nicht offenes handle nicht
4. zwar mehr als 10 Jahre veraltet, hat mit der fragestellung aber auch nichts zu tun
-
sothis_ schrieb:
Jochen Kalmbach schrieb:
Ne, sieht nicht vernünfitg aus...
1. Keine TCHAR-Macros... => _T
2. Was soll den der "\\" vor dem Dateinamen?
3. Warum machst Du ein "CloseHandle" wenn die Datei gar nicht geöffnet werden konnt?
4. Was ist denn "iostream.h" ?1. weil es hier nicht darum geht, deiner ansicht nach sauberen code darzustellen
2. ist vollkommen irrelevant in bezug auf toddys fragestellung
3. ist zwar richtig, dennoch schadet ein CloseHandle() auf ein nicht offenes handle nicht
4. zwar mehr als 10 Jahre veraltet, hat mit der fragestellung aber auch nichts zu tun1. Wenn es nicht gemacht wird, dann lässt sich der Code in einem Default-Projekt ab VS2005 nicht übersetzen...
2. Doch, da der Aufruf nicht zum Erfolgt führt...
3. Stimmt.
4. Ab VS2005 lässt es sich dann nicht mehr übersetzen...
-
Jochen Kalmbach schrieb:
sothis_ schrieb:
Jochen Kalmbach schrieb:
Ne, sieht nicht vernünfitg aus...
1. Keine TCHAR-Macros... => _T
2. Was soll den der "\\" vor dem Dateinamen?
3. Warum machst Du ein "CloseHandle" wenn die Datei gar nicht geöffnet werden konnt?
4. Was ist denn "iostream.h" ?1. weil es hier nicht darum geht, deiner ansicht nach sauberen code darzustellen
2. ist vollkommen irrelevant in bezug auf toddys fragestellung
3. ist zwar richtig, dennoch schadet ein CloseHandle() auf ein nicht offenes handle nicht
4. zwar mehr als 10 Jahre veraltet, hat mit der fragestellung aber auch nichts zu tun1. Wenn es nicht gemacht wird, dann lässt sich der Code in einem Default-Projekt ab VS2005 nicht übersetzen...
2. Doch, da der Aufruf nicht zum Erfolgt führt...
3. Stimmt.
4. Ab VS2005 lässt es sich dann nicht mehr übersetzen...1. oh, das ist mir neu, man lernt nie aus
2. nagut, stimmt
3. yay, we agree
4. dies ist mir ebenfalls neu
5. können wir das unpersönliche aufzählen von argumenten nun lassen?
-
@4: Die <iostream.h> wurde zu einer Zeit entwickelt, als der C++ Standard noch nicht existierte. Die Datei ist also nicht standardkonform (was bedeutet, daß sie (a) bei neueren Compilern nicht mehr existieren muß und (b) Konflikte mit der restlichen IOStream-Bibliothek auslösen könnte). Im Ansi-Standard existiert stattdessen die Datei <iostream> (ohne Endung), die die selbe Funktionalität bereitstellt.
@1: Das ist eine Eigenheit des MSVC - wenn du willst, kannst du dich mal über die Funktion von TCHAR informieren. (nur in Kurzfassung: ab VS05 werden Programme im UNICODE-Modus übersetzt, d.h. alle WinAPI-Funktionen hantieren nicht mehr mit char, sondern mit wchar_t)
-
CStoll schrieb:
@1: Das ist eine Eigenheit des MSVC - wenn du willst, kannst du dich mal über die Funktion von TCHAR informieren. (nur in Kurzfassung: ab VS05 werden Programme im UNICODE-Modus übersetzt, d.h. alle WinAPI-Funktionen hantieren nicht mehr mit char, sondern mit wchar_t)
das ist mir sehr wohl bewusst. nur das ein TCHAR makro mit default einstellungen
zwingend notwendig ist, ist mir neu. vielleicht liegt es auch an meiner
angewohnheit, winapi code grundsätzlich mit unicode zu kompilieren und generisch
mit wchar_t zu arbeiten, so das dies komplett an mir vorbeigegangen ist
-
Eine andere Frage zum Thema:
Kann ich mit CreateFile auch mehrere Dateien schreiben?
Indem ich beispielsweise die Funktion in eine Zählschleife
packe und etwa sowas wie das hier schreibe:CreateFile("C:/Test[i].txt, ...
Bzw. wie würde man sowas realisieren?
MfG, Benni
-
Klar - du kannst in einer Schleife die Dateinamen zusammenbauen, die du an CreateFile weitergeben willst (wie du das machst, hängt von deiner Anwendung ab).
PS: Wie lange hast du jetzt gesucht, um einen Thread auszugraben, der vielleicht am Rande mit deiner Frage zu tun hat?