Überprüfen, ob es sich um eine File oder Pfad handelt
-
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);
}