C++ Filesystem prüfen ob System Datei ist
Moin Moin ihr Lieben.
ich programmier zurzeit einen Kleinen daten Manager. Ich verwende ausschließlich die Filesystem library
Mit einem Pfad soll geprüft werden, ob es ein Ordner oder eine Datei ist. Dieses funktioniert solange es keine Systemdateien im Ordner gibts.
hier ist mein Ausschnitt vom Code.
Code:
std::string DIR_INFO::File_Status()
{
std::string File_Status;
try
{
if (std::filesystem::is_regular_file(cur_path()))
{
File_Status = "FILE";
return File_Status;
}
if (std::filesystem::is_directory(cur_path()))
{
File_Status = "Ordner";
return File_Status;
}
}
catch (std::filesystem::filesystem_error e)
{
std::cout << "\n";
std::cout << "Fehler: " << e.what() << std::endl;
}
}
Meine Frage ist:
Gibt es eine Möglichkeiten zur Abfrage von System Dateien?
Danke für die Hilfe
AW: C++ Filesystem prüfen ob System Datei ist
Moin,
gib mal bitte den Fehler, den du da ausgibst. Wahrscheinlich liegts an den Rechten. Unter Windows mal als Admin und unter Linux mal als root ausführen ums auszutesten (Aber natürlich nur, wenn dein restlicher Code keine Dateien manipuliert und sie nur anschaut!)
AW: C++ Filesystem prüfen ob System Datei ist
Der Fehler lautet wie folgt:
Code:
Der Prozess kann nicht auf die Datei zugreifen, da sie von einem anderen Prozess verwendet wird.:
Eigentlich greif ich auf dei datein in den vorherigen Code nicht zu.
Ich poste mal morgen den restlichen Code wenn es notwendig ist.
Danke für die Hilfe
AW: C++ Filesystem prüfen ob System Datei ist
Hm, ja, und du bist dir sicher, dass diese Exception von diesem Ausschnitt kommt? Ich weiß nämlich nicht genau, ob is_regular_file so ne exception wirft. Hab leider kein Windows System gerade zum testen, aber du kannst ja mal einfach nur eine Zeile (ohne den restlichen Code) mit einer bestimmten Datei ausprobieren. Wenn das dann immer noch so ist, muss man wohl ne Alternative finden, die die Datei nicht öffnet. Vielleicht könntest du bspw jeden "Ordner" einmal öffnen und gucken ob was drin ist und wenn du ne Exception kriegst, weißt du dass es kein Ordner, sondern ne reguläre Datei ist. Keine Ahnung, ob das funktioniert, aber denke schon.
AW: C++ Filesystem prüfen ob System Datei ist
Moin Moin. Ja der fehler entsteht durch die Funktion File_Status().
Hier ist mein restlicher Code. Vllt siehst du irgendwo einen Fehler.
Hauptklasse:
Code:
#include <filesystem>
class DIR_INFO
{
public:
std::filesystem::path m_path;
std::vector<std::string> File_Status_v;
DIR_INFO(std::filesystem::path const& path);
std::filesystem::path cur_path();
void MENU();
std::string filename();
std::string File_Status();
std::uintmax_t File_Size();
std::string Show_Perms();
std::string Show_Perms2();
private:
};
Klasse welche die Eingeschaften von der Klasse DIR:INFO erbt
Code:
#include "DIR_INFO.h"
class DIR_DATA : public DIR_INFO
{
private:
public:
DIR_DATA(std::filesystem::path const& path);
std::vector<DIR_INFO> files();
};
Main CCP
Code:
#include "DIR_INFO.h"
#include "DIR_DATA.h"
#include <iostream>
int
main(int argc, char** argv)
{
DIR_DATA dir{ "C:\\" };
dir.MENU();
for (auto& file : dir.files())
{
std::cout << std::setw(5) << dir.cur_path()
<< std::setw(50) << file.filename() //<< std::endl;
<< std::setw(15) << file.File_Status()// << std::endl;
<< std::setw(15) << file.File_Size() //<< std::endl;
<< std::setw(15) << file.Show_Perms() << std::endl;
}
}
Funktionen
Code:
#include "DIR_INFO.h"
#include "DIR_DATA.h"
#include <iostream>
DIR_INFO::DIR_INFO(std::filesystem::path const& path)
{
m_path = path;
}
std::filesystem::path DIR_INFO::cur_path()
{
return m_path;
}
std::vector<DIR_INFO> DIR_DATA::files()
{
std::vector<DIR_INFO> files;
try
{
for (auto const& entry : std::filesystem::directory_iterator( cur_path(), std::filesystem::directory_options::skip_permission_denied ))
{
files.push_back(entry.path());
}
return files;
}
catch (std::filesystem::filesystem_error e)
{
std::cout << "\n";
std::cout << "Fehler: " << e.what() << std::endl;
}
}
std::string DIR_INFO::filename()
{
return cur_path().filename().string();
}
void DIR_INFO::MENU()
{
std::cout << std::setw(5) << "Search_Manager_V0.60" << std::endl;
std::cout << std::setw(5) << "Pfad " <<
std::setw(61) << "Inhalt" <<
std::setw(15) << "STATUS" <<
std::setw(15) << "Size in Kb" <<
std::setw(15)<<"Rechte"<<std::endl;
}
Ich schau mal ob ich eine Lösung finde.
AW: C++ Filesystem prüfen ob System Datei ist
Ich hatte vor einigen Monaten ein ähnliches Problem. Ein "FileExists" (Delphi Libraryfunktion) schlägt fehl bei Systemdateien. Intern wird die Winapi "FindFirstFile" genutzt, mit dieser bekommt man auch die Dateiattribute heraus und somit auch ob es eine Datei oder ein Ordner ist. Ist also nicht unwahrscheinlich dass die C++ Funktion auch auf dieser API basiert. Bei mir war es die Lösung den Check einfach wegzulassen und tatsächlich auf die Datei zuzugreifen (in dem Fall LoadLibraryEx mit den Flags "LOAD_LIBRARY_AS_IMAGE_RESOURCE OR LOAD_LIBRARY_AS_DATAFILE" um Icons aus Dlls auszulesen und drauf zu reagieren ob das fehlschlägt oder nicht.
Du könntest ja sicher leicht prüfen ob die C++ Funktion auch auf FindFirstFile basiert und testweise mal gucken ob z.B. CreateFile mit Leserechten oder andere Winapis funktionieren. Ich hatte diverse Sachen ausprobiert bevor ich den Check entfernt habe, aber ich weiß echt nicht mehr was ich alles getestet habe.