Überprüfen, ob es sich um eine File oder Pfad handelt
-
prüfen ob letztes zeichen ein '\' oder ein '/' ist.
Dann ist es ein Pfad. sonst ne datei.
Alternativ könnte man versuchen es mit ifstream zu öffnen,
wenns geht, -> Datei, wenn net -> pfad
Oder du überprüfst ob zwischem letztem Pfad zeichen
und ende des strings ein '.' ist.Devil
-
devil81 schrieb:
prüfen ob letztes zeichen ein '\' oder ein '/' ist.
Dann ist es ein Pfad. sonst ne datei.
Alternativ könnte man versuchen es mit ifstream zu öffnen,
wenns geht, -> Datei, wenn net -> pfad
Oder du überprüfst ob zwischem letztem Pfad zeichen
und ende des strings ein '.' ist.Devil
Wobei das schlecht ist, dass, wenn es nicht geht, es auch sein koennte, dass
die Datei nicht existiert.mfg
v R
-
Guten Tag.
Schauen Sie mal bitte hier:
Auf der linken Seite sehen Sie noch ähnliche Funktionen. Davon passt bestimmt eine.
-
Yo, erstmal danke für alle Tipps, nur leider passt keiner. Die MSDN Sites sind mehr als dürftig und die Funktion PathIsDirectory() schluckt auch eine Datei als true.
Das andere ist, dass eine Überprüfung mit "/" oder "\" auch sinnlos ist, da es bei meiner Eingabe frei sein muss, den Pfad entweder als
C:\folder1\folder2\oder
C:\folder1\folder2
einzugeben.
Ausserdem ist auch eine Überprüfung des Pfad-Strings nach "." nicht hilfreich, da man in Windows auch einen Ordner mit "jdf.lksjd" bezeichnen kann. Es wär halt echt hilfreich eine Art "isFile()" Funktion zu haben, aber irgendwie find ich keine!Bin für Tipps offen! Vielen Dank schonmal!
-
Muss das Verzeichnis / die Datei bereits existieren?
Dann könntest du eventuell mit FindFirstFile (WinAPI) Erfolg haben und dann die Flags auf FILE_ATTRIBUTE_DIRECTORY testen.
-
Sorry hilft doch nicht.
C:\Programme\
also mit Backslash hinten dran wird nicht als Verzeichnis erkannt. Nur ohne Backslash.
-
Wenns boost sein darf, würd ich mal da rein schauen: http://www.boost.org/libs/filesystem/doc/index.htm
Ansonsten kriegstes nur plattformabhängig hin, also in POSIX:
struct stat path_stats; stat("/home/foo", &path_stats); if(S_ISDIR(path_stats.st_mode)) { puts("Verzeichnis! Yay!"); }
Unter Windows gabs da diesen FindFirstFile-Kram...wenn ich mich recht entsinne, etwa so:
HANDLE h; WIN32_FIND_DATA wfd; h = FindFirstFile(_T("C:\foo"), &wfd); if(h != INVALID_HANDLE_VALUE && wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) { puts("Verzeichnis! Yay!"); FindClose(h); }
...oder so ähnlich.
-
Leider klappt auch das nicht. Ich versteh´s nicht. Hat jemand noch ne Idee *seufz*???
Ich hab derzeit:
HANDLE h;
WIN32_FIND_DATA FindFileData;
DWORD tester = GetFileAttributes(path);h = FindFirstFile(path,&FindFileData);
cout << "hm:" << hm << endl;
if (tester == FILE_ATTRIBUTE_DIRECTORY && FindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
{
cout<<"directory" << endl;
}
else cout<<"file" << endl;Aber ich krieg immer "file". Auch mit dem oben geposteten Code krieg ich kein Ergebnis. VERZWEIFLUNG!!!!
-
Wenn ich mir die Doku zu GetFileAttributes so ankucke, scheint das ne Bitmaske zu sein, mit == kommste da also nicht weiter. Versuch mal
if(GetFileAttributes(path) & FILE_ATTRIBUTE_DIRECTORY) { std::cout << "Verzeichnis" << std::endl; } else { std::cout << "Datei" << std::endl; }
-
Mit FindFirstFile bzw. GetFileAttributes wird aber wie gesagt C:\\foo\\ nicht als Verzeichnis angesehen.
-
Ähm, danke, aber das hab ich bereits in meinem Code stehen und es geht nicht.
-
Ich hab auch noch folgendes versucht:
struct _finddata_t c_file;
long hFile = _findfirst (path,&c_file);
cout << (c_file.attrib & _A_NORMAL)<<endl;
if (c_file.attrib & _A_SUBDIR)
{
cout << "directory" << endl;
}
else
{
cout << "file" << endl;
}Aber auch hier krieg ich nur "file" zurück
Schön langsam drängt sich mir der Verdacht auf, dass es nicht möglich ist etwas ähnliches wie die isFile() von Java in C++ zu implementieren. Das wär dann echt traurig
-
Du hast in deinem Code == drin stehen, was bei einer Bitmaske herzlich wenig bringt.
Wie dem auch sei, ich hab mal in altem Code rumgewühlt, was auf jeden Fall geht, ist etwas in der Art:
h = FindFirstFile(subdir + "*.*", &wfd); do { if(wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) { // Verzeichnis } else { // Datei } } while(FindNextFile(h, &wfd)); FindClose(h);
Das Ding iteriert durch ein Verzeichnis durch und behandelt Verzeichnisse anders als Dateien - ich habs damals gebraucht, um ein Verzeichnis rekursiv zu durchlaufen, und von diesem Code weiß ich, dass er läuft. Ihn für deine Zwecke anzupassen, sollte trivial sein.
-
BTW, eigentlich gehört der Thread inzwischen ins WinAPI-Forum, oder?
-
> Sorry hilft doch nicht. > > C:\\Programme\ > > also mit Backslash hinten dran wird nicht als Verzeichnis erkannt. Nur ohne Backslash. dann kick doch den letzten "\\" ist das so schwer? ```cpp string eingabe; string::iterator i=eingabe.end()-1;//oder irgendeine andere sache, die vielleicht nicht so holprig ist^^ bin müde^^ if(*i=='\\'){ eingabe.erase(i); } ``` und fertich-.-
-
Ich wollte nur keine Lösung schuldig bleiben. Ich hab´s noch hingekriegt mit folgender Lösung. Das mit "\nul" war richtig, danke! Jetzt läufts:
try
{
string name(__argv[1]);ifstream iff(name.c_str());
if (iff)
{
MessageBox(NULL,
"The choosen path\n"+path+"\nis a file!",
"Scant_2_CSV - Path is file",
MB_ICONERROR | MB_OK);
exit(1);
}
else
{
ifstream ifn(string(name + "\\nul").c_str());
if (ifn)
{
cout << "PATH CORRECT" << endl;
}
else
{
MessageBox(NULL,
"Unknown fatal error",
"Scant_2_CSV - Fatal path error",
MB_ICONERROR | MB_OK);
exit(1);
}
}
}
catch(int) // ,das dann hier gefangen wird, aber mit Bier ging's so besser
{
MessageBox(NULL,
"Unknown fatal error",
"Scant_2_CSV - Fatal path error",
MB_ICONERROR | MB_OK);
exit(1);
}