2011-01-18 11 views
5

Chcę skopiować folder A i wkleić na pulpit.W systemie Windows jest interfejs do kopiowania folderów?

Obecnie używam C++, więc najlepiej interfejs OO, jeśli jest dostępny.

+1

Z jakiej platformy korzystasz? Windows? Unix? To poza twoim angielskim jest w porządku. – Benoit

+1

Jest to zależne od platformy. Na jaką platformę celujesz? –

+0

@Benoit Używam systemu Windows. –

Odpowiedz

-1

działa

#include <iostream> 

int main() 
{ 
    system("xcopy C:\\Users\\Elmi\\Desktop\\AAAAAA\ C:\\Users\\Elmi\\Desktop\\b\ /e /i /h"); 
    return 0; 
} 
+2

Zakłada się, że istnieje 'xcopy'. Niekoniecznie w przypadku Windows Embedded. Nie jest to tak naprawdę "interfejs" dla "zewnętrznego programu dla". Inna odpowiedź przynajmniej nazywa to podejście włamaniem, którym jest. –

-2

Oto przykład przy użyciu SHFileOperation:

http://msdn.microsoft.com/en-us/library/bb776887%28VS.85%29.aspx#example

Oto krótki kilof bez niego:

#import <stdlib.h> 

int main(int argc, char *argv[]) { 

    system("robocopy \"C:\\my\\folder\" \"%userprofile%\\desktop\\\" /MIR"); 
    return 0; 
} 
+1

Używa Windowsa :) więc: 'system (" robocopy C: \\ mój \\ folder% HOMEPATH% \\ Desktop \\ folder/s/mir ");' – Benoit

+0

@Benoit dzięki to działa ... –

+0

To działa, ale dlaczego nie korzystać bezpośrednio z interfejsu Win32 API? Skutecznie uruchamiasz proces zewnętrzny, który sam wykona akcję przy użyciu tego samego interfejsu Win32 API. Wygląda to na bardzo skomplikowany sposób robienia rzeczy dla mnie, a także dodaje zależność od zewnętrznego programu. –

3

(zakładając Windows)

Zastosowanie mogą korzystać ShFileOperation (lub IFileOperation :: CopyItem w systemie Vista). Max.

13

W Windows (Win32), można użyć SHFileOperation, np:

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); 
3

dla platformy rozwiązania agnostyka, którą proponujemy Boost::filesystem. To połączenie jest w zasadzie materiałem referencyjnym. Istnieje metoda copy_file, która kopiuje plik z jednej lokalizacji do drugiej.

W Windows, pulpit jest specjalny folder:

// 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? 
6

Użyj tego

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; 
} 
2

Wychodząc z Visual Studio 2015 można użyć std::filesystem::copy który jest nawet niezależna od platformy, ponieważ jest dostępna w implementacjach obsługujących> = C++ 17.

#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(); 
    } 
} 

zmienić zachowanie fs::copy z std::filesystem::copy_options. Użyłem std::filesystem::path::filename do pobrania nazwy katalogu źródłowego bez konieczności wpisywania jej ręcznie.

Powiązane problemy