2011-11-21 15 views
6

...Delphi programımı çok sayıda dosyanın kopyalanmasını beklemenin bir yolu var mı? Ben şunları yapar bir program yazdım

  • Monitörler sonunda bir alt klasöründe oluşturulur belirli dosya adıyla yeni bir dosya yaratılması için bir klasör.
  • Dosya oluşturulduğunda, alt klasörler yolu bir TList biçimindeki sıraya eklenir.
  • Dosyalar, oluşturma sırasına göre işlenmelidir.
  • Dosyaları bir ağ konumuna taşımayı içeren alt klasördeki tüm dosyaları (bu durumda bulunan resimler) işlemek için bir yordam çağrılır.
  • Alt klasör yolu sıradan kaldırılır (TList).
  • Kuyrukta başka yollar varsa, sonraki yol işleme işlemine iletilir.

I am having problem süresi

Delphi beklemek almanın bir yolu var mı ... bir ağ konumuna dosyalarını kopyalamak için öylesine Resimlerin sayısına ve büyüklüğüne bağlı olarak değişir olmasıdır Dosya işlemi prosedürü bitirmek için?

Bir boolean değerinin değişmesini beklemiş bir süre döngüsünü denedim (kopyalanacak son dosya ağda bulunduğunda değiştirildi) ancak bu uygulama (uygulama.processMessage ile bile olsa) ve dirMonitor bileşeni başarısız oldu. Bir sonraki alt klasörü TList'e ekleyin.

Herhangi bir öneri en çok takdir edilecektir.

Şimdiden teşekkürler. Replys için


Teşekkür ...

Ben sadece Delphi 7 imkânsız yüzden onun bir erişime sahip olmalarına rağmen ... ideal görünüyor OmniThread bir göz vardı.

Sorun şu ki, klasörler, farklı boyutlar ve ağ trafiği vb. Nedeniyle aktarım yapmak için değişken süreler alıyorlar. Çok fazla görüntüye sahip bir klasörün yalnızca birkaç görüntü içeren bir klasör tarafından izlenmesi durumunda; İkisinden küçük olanı ilk önce ağ hedefine ulaşıyor. Ağın bir üçüncü taraf yazdırma biriktiricisi olması, baskıların yanlış sırada kalmasını sağlar.

basitleştirilmiş kodu:


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; 
Ben cevap ile geldim düşünün ... Ben tek bir dizideki tüm dosya operationions yapmak ve küresel bir 'meşgul' ayarlayacağım başladığında boolean ve tamamlandığında yeniden değiştirin. Bu şekilde, herhangi bir dosya işlemi devam ederken kabuk monitörü mesajları kaçırmaz.

+3

Dosyaları kopyalamak için hangi işlevi kullanıyorsunuz? [SHFileOperation] (http://msdn.microsoft.com/en-us/library/windows/desktop/bb762164%28v=vs.85%29.aspx)? – RRUZ

+1

Dosyaları nasıl kopyalıyorsunuz? Lütfen kodu göster. –

+2

Gabr'ın örneğini [kopyalama dosyasında] (http://stackoverflow.com/questions/1766626/copy-file-in-a-thread) bölümünde takip edebilirsiniz. Kopyalama bittiğinde ana konu bildirilir. –

cevap

1

Bir dosya sistemi izlemesi uygulayabilirsiniz.

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

ve sonra ReadDirectoryChangesW çağırmak için bir döngü oluşturun: Esasen, aşağıdaki bayrakları taşıyan bir dosya tanıtıcı oluşturmak.Bağlantılı

bir örnek sınıftır: Why does ReadDirectoryChangesW omit events?

ben farklı yapardınız tek şey olayı çağrılırken muhtemelen yordamı bunu Yürütme olduğunu hatırlayarak (değişiklikleri bildirmek için sınıfın oluşturulmasında bir etkinlik sağlamak olduğunu Senkronize Edilmesi Gerekenler).

İlgili konular