Gibt es eine c++ Bibliothek für Dateioperationen unter win11?

bluedxca93

Commander
Registriert
Juli 2019
Beiträge
2.377
Hi,

gibt es eine zuverlässige freie C++ Bibliothek um Dateien zu verschieben oder zu kopieren?

SHFileOperationW etc. funktioniert nur begrenzt mit Msys2 mingw. Es funktioniert für eine Datei oder einen Ordner irgendwie. Aber sobald mehrere Dateien kopiert werden sollen, passiert Murks oder nichts.

Gibt es eine Bibliothek die mehrere Dateien akzeptiert und robust funktioniert? Xyplorer und Explorer++, Total Commander können es, aber da sind es ja schon ein fertige Programme.

Mfg bluedxca93
 
Nun aus einer einfachen Googlesuche :
Microsoft empfiehlt seit Windows Vista, diese Funktion nicht mehr für neue Projekte zu verwenden. Sie wurde durch das modernere, COM-basierte Interface IFileOperation ersetzt.

Und eine weitere Suche nach IFileOperation fördert uA dies zutage :
Code-Beispiel: Datei in den Papierkorb löschen (C++)
Dieses Beispiel zeigt die grundlegende Verwendung des Interfaces unter Einhaltung des COM-Lebenszyklus:

Code:
#include <windows.h>
#include <shobjidl.h>

HRESULT DeleteFileToRecycleBin(PCWSTR pszFilePath) {
    // 1. COM-Bibliothek initialisieren
    HRESULT hr = CoInitializeEx(NULL, COINIT_APARTMENTTHREADED | COINIT_DISABLE_OLE1DDE);
    if (FAILED(hr)) return hr;

    IFileOperation* pfo = nullptr;
    
    // 2. Instanz von IFileOperation erstellen
    hr = CoCreateInstance(CLSID_FileOperation, NULL, CLSCTX_ALL, IID_PPV_ARGS(&pfo));
    if (SUCCEEDED(hr)) {
        // 3. Flags setzen (z.B. Papierkorb erzwingen, keine Bestätigung)
        hr = pfo->SetOperationFlags(FOF_ALLOWUNDO | FOF_NOCONFIRMATION);
        
        if (SUCCEEDED(hr)) {
            IShellItem* psiTarget = nullptr;
            // 4. Shell-Item aus dem Pfad erstellen
            hr = SHCreateItemFromParsingName(pszFilePath, NULL, IID_PPV_ARGS(&psiTarget));
            
            if (SUCCEEDED(hr)) {
                // 5. Löschauftrag zur Warteschlange hinzufügen
                hr = pfo->DeleteItem(psiTarget, NULL);
                psiTarget->Release();
            }
            
            if (SUCCEEDED(hr)) {
                // 6. Alle geplanten Operationen ausführen
                hr = pfo->PerformOperations();
            }
        }
        pfo->Release();
    }
    
    CoUninitialize();
    return hr;
}

Mit dem Beispiel sollte man auch kopieren resp. verschieben hinbekommen.
 
  • Gefällt mir
Reaktionen: SaschaHa, aragorn92, nutrix und eine weitere Person
Wie wärs damit einfach die stdlib zu verwenden?

C++:
#include <cstdlib>
#include <filesystem>
#include <fstream>
#include <iostream>
namespace fs = std::filesystem;

int main()
{
    fs::create_directories("sandbox/dir/subdir");
    std::ofstream("sandbox/file1.txt").put('a');
    fs::copy("sandbox/file1.txt", "sandbox/file2.txt"); // copy file
    fs::copy("sandbox/dir", "sandbox/dir2"); // copy directory (non-recursive)
    const auto copyOptions = fs::copy_options::update_existing
                           | fs::copy_options::recursive
                           | fs::copy_options::directories_only
                           ;
    fs::copy("sandbox", "sandbox_copy", copyOptions);
    static_cast<void>(std::system("tree"));
    fs::remove_all("sandbox");
    fs::remove_all("sandbox_copy");
}
https://en.cppreference.com/cpp/filesystem/copy
Ergänzung ()

Merlin352 schrieb:
Mit dem Beispiel sollte man auch kopieren resp. verschieben hinbekommen.
Sieht mir eher nach C aus als nach C++
 
  • Gefällt mir
Reaktionen: dms, Drahminedum, madmax2010 und 2 andere
Piak schrieb:
Nein GTK. Aber hier in der Frage geht es mir nur um die Heintergrundprozesse und nicht um die grafische Oberfläche. Das ich damit möglicherweise ein XYZ Problem aufmache ist mir bewusst.

IFileOperation? Naja schaue ich mir die Tage mal an.

Eben kam mir die Idee C++17 zu verwenden und std::filesystem mitzunutzen. Die eigentliche Dateioperation soll dann aber doch einen grafischen Fortschrittsbalken haben.
 
KitKat::new() schrieb:
Wie wärs damit einfach die stdlib zu verwenden?
Willst du etwa implizieren, das dateioperationen etwas sind, was andauernd gebraucht wird? So häufig, dass sie quasi in jedem framework und jeder Standard lib sind
Krass
Ergänzung ()

bluedxca93 schrieb:
Die eigentliche Dateioperation soll dann aber doch einen grafischen Fortschrittsbalken haben.
Dann nutze eine der Fortschrittsbalken in gtk..
 
Qt ist doch nicht nur grafische Oberfläche..... Ist ein komplettes Framework....
 
  • Gefällt mir
Reaktionen: Piak und madmax2010
madmax2010 schrieb:
Dann nutze eine der Fortschrittsbalken in gtk
Wäre eine Option. Oder ich nutze den Dialog von Microsoft aber für jede Datei einzeln. Was langsam sein kann. Aber erstmal möchte ich einen stabilen Lösung.

Bruce_Willis schrieb:
Ist ein komplettes Framework....
Möglich aber ich kenne mich mit qt so rein gar nicht aus. Gtk3 geht irgendwie mittlerweile.
 
Hab es jetzt hinbekommen. Anders als gedacht aber es scheint stabil.

Und zwar hat zzzfm/pcmanfm für Linux eine ptk-files.cpp. Auch wenn die nicht 1:1 unter Windows läuft hat es damit jetzt funktioniert.

Papierkorb über IFileOperation , Rest über die Standard library in c++17. Dialoge größtenteils über GTK3.
 
Zurück
Oben