PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Herausfinden ob Datei schon exisitiert


Che
2002-12-28, 18:15:54
Hi Leute!

Wie kann ich aus meinem Programm heraus feststellen, ob eine Datei (bzw. eine Dateiname) schon exisitiert? Ich habe mir die MSDN zu fopen() durchgelesen weil ich dachte wenn ich einee Datei zum schreiben öfnne, die schon existiert, dann müsste doch eine Fehlermeldung kommen, aber nein, der Inhalt wird einfach gelöscht :(. Es müsste doch eine Funktion geben, die mir sagt, ob ein gewisser Dateiname schon "verbraucht" ist.

Irgendwelche Ideen?

Demirug
2002-12-28, 18:24:24
Bei CreateFile kann man mit einem Flag bestimmen was passieren soll wenn die Datei schon vorhanden ist.

Exxtreme
2002-12-28, 18:26:15
Es kommt drauf an, wie du die Datei öffnest. :)
*meinprogrammierbuchsuchundrauskram*

Der Syntax von fopen ist folgender:
FILE* fopen(char* Dateiname, *char Modus)

Und der Modus entscheidet u.a., ob die Datei beim Öffnen gelöscht wird oder nicht. :)

Hier die Modi:
"r" -> Öffnet die Datei zum Lesen
"w" -> Öffnet die Datei zum Schreiben. Der Inhalt einer bestehenden Datei wandert ins Nirwana.
"a" -> Öffnet eine bestehende Datei zum Schreiben. Der Inhalt wird nicht gelöscht.
"w+" -> Öffnet eine Datei zum Lesen und Schreiben. Bestehende Daten wandern... du weisst schon.
"a+" -> Öffnet eine bestehende Datei zum Lesen und Schreiben. Der Inhalt wird nicht gelöscht.

Hope that helps.

Che
2002-12-28, 19:12:48
Holla, das geht wieder schnell heute ;)

@Demirug:
CreateFile() kenn ich noch nicht, aber ich glaub das ist das was ich brauch. Thx

@Exxtreme:
Auch dir danke.
Möglicherweise hab ich mein Problem ungeanu formuliert: Ich suche eine Möglichkeit mit der ich feststellen kann ob eine Datei schon exisitiert. Mit fopen() kann ich zwar auf verschiedene Arten öffnen, aber ich bekomme keine Rückmeldung ob die Datei schon exisitiert, zb.
fopen("test.txt", "w")
Exisitiert die Datei nicht wird sie zum schreiben geöffnet. Exisitiert sie, wird sie geöffnet und der Inhalt gelöscht. Darüber erhalte ich aber keine Rückmeldung!! Ich kann nicht einmal über den Rückgabewert feststellen, ob die Datei schon gibt oder nicht (das finde ich wäre logisch(er): wenn ich eine Datei zum schreiben öffne, die schon exisitiert, ist der Rückgabewert NULL)

unwissend!
2002-12-28, 19:25:08
Hab zwar nicht die super Ahnung aber ich versuchs mal.
Bsp:
FILE *file;

file = fopen(Name, "r"); // Datei zum lesen öffnen
if(file == NULL) // existiert die Datei ???
{
// existiert nicht
}
else if
{
// existiert
}

cu unwissend!

MeLLe
2002-12-28, 19:29:45
Sollte nicht

FILE * fhnd = fopen("bla.blub", "r");

if (fhnd)
{
// Datei vorhanden
// -> vorhandene zum Anhängen öffnen
fclose(fhnd);
fhnd = fopen("bla.blub","a");
}
else
{
// Datei nicht vorhanden
// -> neue anlegen und zum Schreiben öffnen
fhnd = fopen("bla.blub","w");
}
dieses Stück Code Deinem Problem am nächsten kommen?

edit: Mist, Mr. unwissend wusste doch was und war schneller. ;)

Che
2002-12-28, 22:04:14
Ich bin einfach zu dumm zum denken heute, natürlich gehts so! Danke ihr beiden.
(Hmm, dass ich da nicht selber draufgekommen bin macht mich jetzt wirklich nachdenklich... ;) )

Tom Servo
2002-12-29, 11:43:50
Naja, ich weiss nicht. Wenn man eine Datei nicht zum lesen öffnen kann, dann hat man vielleicht nur keine Rechte zum lesen.

Man müsste als evlt. noch ERRNO testen.

Da die MSDN erwähnt wurde, hier (http://www.microsoft.com/technet/treeview/default.asp?url=/technet/scriptcenter/filefolder/ScrFF75.asp) die Mircosoft Lösung für eine Skriptsprache und NET.

Ist lange her, aber ich habe m.W. immer OS-Funktionen für diesen Test benutzt weil es da in ISO C nichts gab. Unter AmigaOS gabs da IIRC direkt eine Funktion für diesen Zweck.
Unter Unix ging es wohl mit stat().

Laut VisualStudio gibts _stat() auch unter Windows.

Geht damit so:

#include <time.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <stdio.h>


int
file_exist(const char *name)
{
struct _stat buf;

return _stat(name, &buf) == 0;
}

void
print_file_exist(const char *name)
{
printf("Die Datei %s %s.\n", name,
file_exist(name) ? "existiert" : "existiert nicht");
}

int
main()
{
print_file_exist("asdfasdfew");
print_file_exist("c:/autoexec.bat");
return 0;
}

Che
2002-12-29, 14:41:25
Originally posted by Tom Servo
Naja, ich weiss nicht. Wenn man eine Datei nicht zum lesen öffnen kann, dann hat man vielleicht nur keine Rechte zum lesen.

Man müsste als evlt. noch ERRNO testen.

Da die MSDN erwähnt wurde, hier (http://www.microsoft.com/technet/treeview/default.asp?url=/technet/scriptcenter/filefolder/ScrFF75.asp) die Mircosoft Lösung für eine Skriptsprache und NET.



Danke auch dir, aber für meine Zwecke reicht die methode von melle bzw. unwissend völlig aus. Werd mir aber trotzdem mal anschaun was das ist was du da vorschlägst, für neue Wege bin ich immer offen ;)