# Datei löschen, falls vorhanden



## the snake II (23. August 2005)

Hallo zusammen,

ich habe von MSDN ein kleines Programm, das den Inhalt eines Ordners ausliest.
Es arbeitet auf Win98 als Consolen Anwendung.
Ich habe es so umgeschrieben, dass es ein anderes Programm startet, welches dafür zuständig ist, die Datei zu Drucken.
Das funktioniert alles wunderbar, nur wenn in dem Ordner keine Dateien vorhanden sind, tritt die Eigenschaft des MS-DOS Befehls "del" auf, die bei Übergabe von "del .\jobs\" (was ja übergeben wird, wenn keine Datei vorhanden ist), eine Abfrage einletet die etwa so aussieht:
"Sollen alle Dateien im Verzeichnis gelöscht werden?(J/N) "
Da diese Anwendung auf einem Server laufen soll, der über keinen Monitor verfügt, ist das etwas hinderlich, denn diese prozedur wird von einem dritten Programm alle 30 Sekunden neu gestartet. Wenn jetzt die Abfrage dort steht wird alles angehalten.
Zur Erklärung: Das Druckprogramm ist dazu gedacht, einen nicht-WinXP fähigen Drucker auf WinXP zu nutzen. Dazu wurde er auf einem Win98 Rechner installiert. Dazu hab ich ein Programm draufgemacht, das in der DOS-Eingabeaufforderung PostScript Dateien drucken kann. Möchte man nun von WinXP aus ein Dokument drucken, dann klickt man auf drucken und es wird eine PostScript Datei erzeugt und im "jobs" Verzeichnis auf dem Win98 Rechner abgelegt. Ein Programm ruft alle 30 Sekunden ein anderes Programm auf, welches im "jobs" Verzeichnis per "FindFirstFile" jede dort befindliche Datei an das Druckprogramm sendet.
Ist die Datei gedruckt (bzw. sind 30 Sekunden Vergangen) soll die Datei gelöscht werden.
Da ich nicht weiß, wie man mit C++ Dateien löscht, habe ich eben den "del" Befehl von MS-DOS benutzt. Da tritt eben das oben genannte Problem auf.

Hier mein Programm:

```
#define _WIN32_WINNT 0x0400

#include <windows.h>
#include <stdio.h>
#include <string>
using namespace std;

string delquery;
string delprequery = "del ";
string argument;
string query_pre = "C:\\gs\\gsview\\gsprint .\\jobs\\";
string query;

int main(int argc, char *argv[])
{
  WIN32_FIND_DATA FindFileData;
  HANDLE hFind;

  printf ("Gefundene Datei:  %s.\n", argv[1]);
  hFind = FindFirstFile(argv[1], &FindFileData);
  if (hFind == INVALID_HANDLE_VALUE) 
  {
    printf ("Invalid File Handle. GetLastError reports %d\n", 
            GetLastError ());
    return (0);
  } 
  else
  {
    argument = FindFileData.cFileName;
    delquery = delprequery + argument;
    query = query_pre + argument;
    system(query.c_str());
    Sleep(30000);
    system(delquery.c_str());
    FindClose(hFind);
    return (1);
  }
}
```
Eigentlich sollte doch bei der if-Abfrage geklärt werden, ob eine Datei gefunden wurde, oder nicht?
Hat jemand eine Lösung für mich?


----------



## deepthroat (23. August 2005)

Die Funktion um Dateien zu löschen heißt remove .

Desweiteren findet die Funktion "FindFirstFile" nicht nur Dateien sondern auch Unterverzeichnisse (siehe MSDN). Daher ist es auch zu erklären warum bei if-Abfrage der else-Teil ausgeführt wird weil ja ein Unterverzeichnis .\jobs existiert. Evtl. solltest du mit GetFileAttributes bzw. GetFileAttributesByHandle noch prüfen ob es sich um eine Datei handelt oder nicht.


----------



## Tobias K. (23. August 2005)

moin


DeleteFile ginge auch noch, aber da du anscheinend in C programmierst nimm remove.


mfg
umbrasaxum


----------



## the snake II (23. August 2005)

deepthroat hat gesagt.:
			
		

> Desweiteren findet die Funktion "FindFirstFile" nicht nur Dateien sondern auch Unterverzeichnisse (siehe MSDN). Daher ist es auch zu erklären warum bei if-Abfrage der else-Teil ausgeführt wird weil ja ein Unterverzeichnis .\jobs existiert. Evtl. solltest du mit GetFileAttributes bzw. GetFileAttributesByHandle noch prüfen ob es sich um eine Datei handelt oder nicht.


Das Programm liegt in "C:\". Das Programm, welches dieses ausführt übergiebt über "argv[1]": "FileRead.exe .\\jobs\\*.*".
Das heißt doch, dass FileRead.exe (mein Programm; siehe 1. Post) nur in den Ordner "jobs" guckt und dort ist ja kein Unterordner oder?


			
				Tobias K. hat gesagt.:
			
		

> DeleteFile ginge auch noch, aber da du anscheinend in C programmierst nimm remove.


Ich hatte eigentlich vor, C++ zu lernen. Dieses Beispiel war halt von MSDN. So etwas könnte ich nicht selber erstellen. Ein bisschen kann ich ja auch (per Lehrbuch) C++. Allerdings ist mir noch nicht so klar, wo die Unterschiede zwischen C und C++ liegen.
Ich nehme aber remove, da jeder C++ Compiler, wie ich hörte, auch C kompiliert.

Gruß,

The Snake II

//Edit: Ich hab einfach den Teil mit der DOS Anweisung gelöscht und durch "remove(argv[1]); ersetzt und es klappt:
Vielen Dank


----------



## jokey2 (24. August 2005)

> Das heißt doch, dass FileRead.exe (mein Programm; siehe 1. Post) nur in den Ordner "jobs" guckt und dort ist ja kein Unterordner oder?


Jeder Ordner hat prinzipiell 2 Unterordner, nämlich '.' und '..'. Das erste verweist auf das eigene Verzeichnis, das zweite auf das übergeordnete Verzeichnis. Deshalb mußt Du bei FindFirstFile und FindNextFile immer prüfen ,ob du ein Verzeichnis oder eine Datei gefunden hast. Normalerweise findet das nämlich immer zuerst genau diese beiden Verzeichnisse.
 EDIT:
 Nochwas zu Deinem Programm: Normalerweise liefert ein Programm 0 zurück, wenn es fehlerfrei beendet wurde, bei Auftreten eines Fehlers ungleich 0. Das ist zwar keine Vorschrift, aber doch eine Konvention. So bricht z.B. make die Verarbeitung mit einer Fehlermeldung ab, wenn ein davon aufgerufenes Programm nicht 0 zurückliefert.


----------



## jokey2 (24. August 2005)

Nochwas zum Unterschied zwischen C und C++:
 C++ baut zwar auf C auf, ist aber trotzdem etwas völlig anderes. C ist eine prozedurale Programmiersprache, d.h. die Programme bestehen aus einer Sammlung von Funktionen. C++ ist eine objektorientierte Programmiersprache. Da werden die Funktionalitäten in Objekten (Klassen) angelegt. Das führt zu einem völlig anderen Konzept des Programmaufbaus, auch wenn die Syntax gleich ist (bis auf die zusätzlichen Schlüsselwörter in C++).


----------



## Flegmon (24. August 2005)

the snake II hat gesagt.:
			
		

> Ich nehme aber remove, da jeder C++ Compiler, wie ich hörte, auch C kompiliert.



Nebenbei. Ein C++ Compiler kann normalerweiße auch B (vorgänger von C) kompilieren!



			
				jokey2 hat gesagt.:
			
		

> auch wenn die Syntax gleich ist (bis auf die zusätzlichen Schlüsselwörter in C++).



damit sind dinge wie Templates gemeint.


----------

