API
21.08.1999
  • Kopiowanie i kasowanie plików przy użyciu "latających folderów".

       Możesz łatwo kopiować, przenosić i usuwać pliki poprzez wywołania funkcji API CopyFile, DeleteFile i MoveFile. Te funkcje są łatwe w użyciu, ale nie wyświetlają okienek z "latającymi folderami". Oto ich przykłady:

  // kopiuje SOURCE.TXT do DEST.TXT, argument true mówi windows
  // żeby nie doszło do operacji gdy DEST.TXT już istnieje.
    if( CopyFile("C:\\SOURCE.TXT","C:\\DEST.TXT", true) == FALSE)
      Application->MessageBox("CopyFile nie wyszło", "Error", MB_OK);

  // MoveFile i DeleteFile także zwracają FALSE przy błędzie.
    MoveFile("C:\\SOURCE.TXT","C:\\WINDOWS\\TEMP\\DEST.TXT");
    DeleteFile("C:\\SOURCE.TXT");
      Aby uzyskać "latające foldery", musisz użyć funkcji API SHFileOperation. Oto te same przykłady co wyżej, ale z wykorzystaniem funkcji SHFileOperation.
    #include <shellapi.h>


    // kopiuje SOURCE.TXT do DEST.TXT;
    char *From = "C:\\SOURCE.TXT\0";
    char *To   = "C:\\DEST.TXT\0";
    SHFILEOPSTRUCT op;
    op.hwnd  = Handle;  // uchwyt głównej formy aplikacji
    op.wFunc = FO_COPY;
    op.pFrom = From;
    op.pTo   = To;
    op.fFlags= 0;
    SHFileOperation( &op);

    // przenosi SOURCE.TXT do katalogu windows temp
    char *From = "C:\\SOURCE.TXT\0";
    char *To   = "C:\\WINDOWS\\TEMP\0";
    SHFILEOPSTRUCT op;
    op.hwnd  = Handle;
    op.wFunc = FO_MOVE;
    op.pFrom = From;
    op.pTo   = To;
    op.fFlags= 0;
    SHFileOperation( &op);

    // wysyła pliki z folderu temp do kosza
    char *File = "C:\\windows\\temp\\*.TMP\0";
    SHFILEOPSTRUCT op;
    op.hwnd  = Handle;
    op.wFunc = FO_DELETE;
    op.pFrom = File;
    op.fFlags= FOF_ALLOWUNDO;
    SHFileOperation( &op);

    // kopiuje wszystkie pliki tekstowe do katalogu temp
    char *From = "C:\\*.TXT\0";
    char *To   = "C:\\WINDOWS\\TEMP\0";
    SHFILEOPSTRUCT op;
    op.hwnd  = Handle;
    op.wFunc = FO_COPY;
    op.pFrom = From;
    op.pTo   = To;
    op.fFlags= 0;
    SHFileOperation( &op);
Uwagi:

1. Kiedy wykorzystujesz FO_DELETE, pliki zostaną wysłane do kosza, pod warunkiem, że fFlags zawiera styl FOF_ALLOWUNDO. Inaczej będą skasowane.

2. Pozycje pFrom i pTo są wskaźnikami do char. Nie są tablicami. Muszą wskazywać na string, ale struktura nie zawiera pamięci do przechowywania tegoż stringu. Nie rób tego w ten sposób:

    op.pFrom = "C:\\*.TXT";
    op.pTo   = "C:\\TEMP";
3. Zauważ dodatkowy terminator NULL (dodane /0) w stringu. Dokumentacja MSDN mówi, że stringi pTo i pFrom muszą być zakończone podwójnym NULL.

4. pTo i pFrom mogą zawierać więcej niż jeden string. Każdy string powinien być oddzielony terminatorem NULL. Oto przykład:

 char *From = "C:\\*.txt\0C:\\*.log\0C:\\*.tmp\0";
    op.pFrom   = From;

    char *From = "C:\\*.txt\0"
                 "C:\\*.log\0"
                 "C:\\*.tmp\0";
5. Kiedy kopiujesz albo przenosisz pliki, styl FOF_RENAMEONCOLLISION w parametrze fFlags zapobiegnie nadpisaniu innych plików. Zostaną stworzone kopie "Kopia readme.txt" (tak jak robi to explorer).

6. Możesz także określić FO_RENAME jako parametr wFunc. Pojemnik fFlags może zawierać wiele zaawansowanych stylów. Sprawdź plik WIN32.HLP.