2011-11-21 12 views
6

Napisałem program, który wykonuje następujące ...Czy istnieje sposób, aby mój program delphi czekał na skopiowanie dużej liczby plików?

  • Monitory folder do tworzenia nowego pliku z określonego pliku, który ostatecznie zostanie utworzony w folderze sub.
  • Po utworzeniu pliku ścieżka do podfolderów jest dodawana do kolejki w postaci TList.
  • Pliki muszą zostać przetworzone w kolejności tworzenia.
  • Procedura jest wywoływana w celu przetwarzania wszystkich plików (w tym przypadku obrazów) w podfolderze, który obejmuje przenoszenie plików do lokalizacji sieciowej.
  • Ścieżka podfolderu jest usuwana z kolejki (TList).
  • Jeśli w kolejce istnieje więcej ścieżek, następna ścieżka zostaje przekazana do procedury przetwarzania.

Problem mam jest to, że czas, aby skopiować pliki do lokalizacji sieciowej różni się w zależności od liczby i wielkości, dzięki czemu obrazy ...

Czy istnieje sposób, aby uzyskać Delphi czekać dla procedury operacji na plikach do końca?

Próbowałem pętli, która czekała na zmianę wartości boolowskiej (zmieniona, gdy ostatni plik do skopiowania został znaleziony w sieci), ale która zawiesiła aplikację (nawet z application.processMessage) i składnik dirMonitor nie powiodło się dodaj następny podkatalog do TList.

Wszelkie sugestie będą mile widziane.

Z góry dziękuję.


Dzięki za replys ...

miałem przyjrzeć OmniThread który wygląda idealny ... chociaż mam dostęp do Delphi 7 więc jej nie tylko iść.

Problem polegający na tym, że przenoszenie folderów zajmuje różną ilość czasu ze względu na różne rozmiary i ruch sieciowy itp. Gdy po folderze z dużą liczbą zdjęć następuje folder zawierający tylko kilka zdjęć, mniejszy z nich dociera najpierw do miejsca docelowego sieci. Sieć docelowa jest zewnętrznym buforem wydruku, więc wydruki są wyłączane w niewłaściwej kolejności.

Kod uproszczony:

procedure TForm1.programTimerTimer(Sender: TObject); 
begin 
    if (fileOperationInProgress = false) AND (programPaused = false) then 
    begin 
     processOrderQueue; 
    end; 
end; 

procedure TForm1.processOrderQueue; 
begin 
    // gets folder paths from queue 
    // processes images 
    // copy to print spooler (network location) 

    copyFolder(fromPath, toPath); 

    // remove temp files 
end; 

procedure TForm1.copyFolder(copyFrom : String; copyTo : String); 
var 
    fos : TSHFileOpStruct; 
begin 
    fileOperationInProgress := True; 

    ZeroMemory(@fos, SizeOf(fos)); 

    with fos do 
    begin 
     wFunc := FO_COPY; 
     fFlags := FOF_FILESONLY or FOF_SILENT; 
     pFrom := PChar(copyFrom); 
     pTo := PChar(copyTo) 
    end; 

    ShFileOperation(fos); 


    fileOperationInProgress := False; 
end; 

Pomyśl mam wymyślić odpowiedź ... Mam zamiar zrobić wszystkie operationions plików w jednym wątku i ustawić globalny „zajęty” Boolean po uruchomieniu i zmień go ponownie po zakończeniu. W ten sposób monitor powłoki nie ominie wiadomości, gdy trwają operacje na plikach.

+3

Z jakiej funkcji kopiuje się pliki? [SHFileOperation] (http://msdn.microsoft.com/en-us/library/windows/desktop/bb762164%28v=vs.85%29.aspx)? – RRUZ

+1

W jaki sposób kopiujesz pliki? Proszę pokazać kod. –

+2

Możesz spróbować naśladować przykład Gabra w [kopia-plik-w-wątku] (http://stackoverflow.com/questions/1766626/copy-file-in-a-thread). Główny wątek jest powiadamiany po zakończeniu kopiowania. –

Odpowiedz

1

Można zaimplementować zegarek systemu plików. Zasadniczo można utworzyć uchwytu pliku z następujących flag:

CreateFile(PChar(FDirectoryToWatch), FILE_LIST_DIRECTORY or GENERIC_READ, 
FILE_SHARE_READ or FILE_SHARE_WRITE or FILE_SHARE_DELETE, nil, OPEN_EXISTING, 
FILE_FLAG_BACKUP_SEMANTICS or FILE_FLAG_OVERLAPPED, 0); 

a następnie utworzyć pętlę, aby zadzwonić ReadDirectoryChangesW.

Związany jest klasa przykład: Why does ReadDirectoryChangesW omit events?

Jedyną rzeczą, którą chciałbym zrobić inaczej jest zapewnienie zdarzenie w tworzeniu klasy do powiadamiania o zmianach (pamiętając, że przy wywołaniu zdarzenia w procedurze prawdopodobnie go wykonać musi być zsynchronizowany).

Powiązane problemy