6 Stimmen

Gibt es unter Windows eine Schnittstelle zum Kopieren von Ordnern?

Ich möchte den Ordner A kopieren und auf dem Desktop einfügen.

Ich verwende derzeit C++, also vorzugsweise eine OO-Schnittstelle, wenn verfügbar.

18voto

Daniel Gehriger Punkte 7206

Unter Windows (Win32) können Sie Folgendes verwenden SHFileOperation , z.B.:

SHFILEOPSTRUCT s = { 0 };
s.hwnd = m_hWnd;
s.wFunc = FO_COPY;
s.fFlags = FOF_SILENT;
s.pTo = "C:\\target folder\0";
s.pFrom = "C:\\source folder\\*\0";
SHFileOperation(&s);

10voto

Behrouz.M Punkte 3215

Verwenden Sie diese

bool CopyDirTo( const wstring& source_folder, const wstring& target_folder )
{
    wstring new_sf = source_folder + L"\\*";
    WCHAR sf[MAX_PATH+1];
    WCHAR tf[MAX_PATH+1];

    wcscpy_s(sf, MAX_PATH, new_sf.c_str());
    wcscpy_s(tf, MAX_PATH, target_folder.c_str());

    sf[lstrlenW(sf)+1] = 0;
    tf[lstrlenW(tf)+1] = 0;

    SHFILEOPSTRUCTW s = { 0 };
    s.wFunc = FO_COPY;
    s.pTo = tf;
    s.pFrom = sf;
    s.fFlags = FOF_SILENT | FOF_NOCONFIRMMKDIR | FOF_NOCONFIRMATION | FOF_NOERRORUI | FOF_NO_UI;
    int res = SHFileOperationW( &s );

    return res == 0;
}

6voto

Roi Danton Punkte 6655

Beginnend mit Visual Studio 2015 können Sie std::filesystem::copy die sogar plattformunabhängig ist, da sie in Implementierungen verfügbar ist, die >= C++17 unterstützen.

#include <exception>
#include <experimental/filesystem> // C++-standard filesystem header file in VS15, VS17.
#include <iostream>
namespace fs = std::experimental::filesystem; // experimental for VS15, VS17.

/*! Copies all contents of path/to/source/directory to path/to/target/directory.
*/
int main()
{
    fs::path source = "path/to/source/directory";
    fs::path targetParent = "path/to/target";
    auto target = targetParent / source.filename(); // source.filename() returns "directory".

    try // If you want to avoid exception handling then use the error code overload of the following functions.
    {
        fs::create_directories(target); // Recursively create target directory if not existing.
        fs::copy(source, target, fs::copy_options::recursive);
    }
    catch (std::exception& e) // Not using fs::filesystem_error since std::bad_alloc can throw too.
    {
        std::cout << e.what();
    }
}

Ändern Sie das Verhalten von fs::copy con std::filesystem::copy_options . Ich habe verwendet std::filesystem::path::filename um den Namen des Quellverzeichnisses abzurufen, ohne ihn manuell eingeben zu müssen.

3voto

Max Punkte 3122

(Windows vorausgesetzt)

Verwenden Sie ShFileOperation (oder IFileOperation::CopyItem unter Vista). Max.

3voto

Moo-Juice Punkte 37380

Für eine plattformunabhängige Lösung würde ich Folgendes vorschlagen Boost::Dateisystem . Dieser Link ist im Wesentlichen das Referenzmaterial. Es gibt eine copy_file Methode, die eine Datei von einem Ort zu einem anderen kopiert.

Unter Windows ist der Desktop ein spezieller Ordner:

// String buffer for holding the path.
TCHAR strPath[ MAX_PATH ];

// Get the special folder path.
SHGetSpecialFolderPath(
    0,       // Hwnd
    strPath, // String buffer.
    CSIDL_DESKTOPDIRECTORY, // CSLID of folder
    FALSE ); // Create if doesn't exists?

CodeJaeger.com

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.

Powered by:

X