Ich verwende C, und manchmal muss ich Pfade behandeln wie
- C:\Whatever
- C:\Whatever\
- C:\Whatever\Somefile
Gibt es eine Möglichkeit zu prüfen, ob ein bestimmter Pfad ein Verzeichnis oder eine Datei ist?
Ich verwende C, und manchmal muss ich Pfade behandeln wie
Gibt es eine Möglichkeit zu prüfen, ob ein bestimmter Pfad ein Verzeichnis oder eine Datei ist?
Das einzige Problem, das ich mit diesem Code habe, ist der Kommentar im Fall else. Nur weil etwas kein Verzeichnis ist, heißt das noch lange nicht, dass es eine Datei ist.
Wenn ich versuche, dies zu verwenden, erhalte ich "Aggregat 'main(int, char**)::stat s' hat einen unvollständigen Typ und kann nicht definiert werden", und ich konnte wirklich nicht herausfinden, was der Fehler ist. Es gibt Fehler zuerst in der Zeile von struct stat s; Was könnte mein Fehler sein?
Rufen Sie an. GetFileAttributes und suchen Sie nach dem Attribut FILE_ATTRIBUTE_DIRECTORY.
Mit C++14/C++17 können Sie die plattformunabhängige is_directory()
y is_regular_file()
von der Dateisystem-Bibliothek .
#include <filesystem> // C++17
#include <iostream>
namespace fs = std::filesystem;
int main()
{
const std::string pathString = "/my/path";
const fs::path path(pathString); // Constructing the path from a string is possible.
std::error_code ec; // For using the non-throwing overloads of functions below.
if (fs::is_directory(path, ec))
{
// Process a directory.
}
if (ec) // Optional handling of possible errors.
{
std::cerr << "Error in is_directory: " << ec.message();
}
if (fs::is_regular_file(path, ec))
{
// Process a regular file.
}
if (ec) // Optional handling of possible errors. Usage of the same ec object works since fs functions are calling ec.clear() if no errors occur.
{
std::cerr << "Error in is_regular_file: " << ec.message();
}
}
In C++14 verwenden std::experimental::filesystem
.
#include <experimental/filesystem> // C++14
namespace fs = std::experimental::filesystem;
Weitere implementierte Kontrollen sind aufgeführt in Abschnitt "Dateitypen" .
Hallo @Roi Danton, danke für Ihre Antwort. Wissen Sie, warum dies nicht auf macOS funktioniert? Es scheint, dass es mit Clang zusammenhängt, das diese Bibliothek nicht unterstützt. Sehr unglücklich, IMO.
@mannyglover Clang unterstützt std::filesystem
Stellen Sie sicher, dass Sie Clang 7 oder höher mit der Option -std=c++17
. Minimales Beispiel im Compiler-Explorer .
Unter Win32 verwende ich normalerweise PathIsDirectory und ihre Schwesterfunktionen. Dies funktioniert in Windows 98, was GetFileAttributes nicht tut (laut MSDN-Dokumentation).
Ich habe es nicht ausprobiert, aber die früheste dokumentierte Version wurde mit Windows 95 ausgeliefert, also wahrscheinlich nicht.
Sie können sicher verwenden GetFileAttributes()
in Windows 98, und AFAIK war es schon vor der Existenz von PathIsDirectory()
. Sie können sich nicht auf die MSDN-Dokumentation verlassen, wenn Sie die Mindestanforderungen an das Betriebssystem einer API überprüfen, denn MSDN lügt! Wenn MS die Unterstützung für eine Betriebssystemversion einstellt, werden die meisten Verweise darauf aus der MSDN-Dokumentation entfernt, insbesondere bei den Mindestanforderungen an das Betriebssystem für bestehende APIs.
Unter Windows können Sie Folgendes verwenden GetFileAttributes an einem Griff öffnen .
CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.