2008-08-20 22 views
12

Dosyaları, aralıklı bağlantılara toleranslı bir Windows ağ paylaşımı üzerinden kopyalamanın sağlam bir yolunu arıyorum. Uygulama genellikle büyük hastanelerde kablosuz, mobil iş istasyonlarında kullanılır ve bağlantıyı anlık ya da bir kerede birkaç dakika için kaybedebilir varsayalım. İlgili dosyalar genellikle yaklaşık 200KB - 500KB arasındadır. Uygulama VB6 (ugh) ile yazılmıştır, ancak biz sık sık Windows DLL çağrıları kullanarak sona erer.Aralıklı bir Ağ Bağlantısı Üzerinden Dosyaları Kopyalama

Teşekkürler!

cevap

5

Asıl sorununun ne olduğu konusunda emin değilim, bu yüzden birkaç düşünceyi fırlatacağım.

  • Yeniden başlatılabilir kopyalar (bu kadar küçük dosya boyutlarıyla, bu büyük bir anlaşma gibi görünmüyor) ister misiniz? Eğer öyleyse, CopyFileEx with COPYFILERESTARTABLE
  • 'a bakın Doğrulanabilir kopyalar mı istiyorsunuz? Sanki karmaşıkları doğrulayarak bunu yapmışsın gibi geliyor.
  • Daha iyi performans mı istiyorsunuz? Sunucuda hiçbir şey yapamayacağınız gibi, zor olacak. Aksi halde, TransmitFile yardımcı olabilir.
  • Sadece bir ateş ve unutma işlemi ister misiniz? Ben robocopy, ya da TeraCopy ya da bir şey işe yarayacak sanırım - ama bana biraz rahatsız görünüyor.
  • Ağın ne zaman geri geldiğini bilmek ister misiniz? IsNetworkAlive cevabınızı aldı. İlk onu başarıyla kopyaladıktan hangi dosyaları takibini kaydeder Dosyalar sıkıştırılarak

    sourceFile = Compress("*.*"); 
    destFile = "X:\files.zip"; 
    
    int copyFlags = COPYFILEFAILIFEXISTS | COPYFILERESTARTABLE; 
    while (CopyFileEx(sourceFile, destFile, null, null, false, copyFlags) == 0) { 
        do { 
        // optionally, increment a failed counter to break out at some point 
        Sleep(1000); 
        while (!IsNetworkAlive(NETWORKALIVELAN)); 
    } 
    

    : Şu ana kadar bildiklerini dayanarak

, şu sözde kod yaklaşımım olacağını düşünüyorum ve yeniden başlatmanız gereken. Ayrıca, her iki taraftaki bazı CPU gücü pahasına, kopyanın daha hızlı (toplam dosya boyutu ve daha büyük tek dosya boyutu) daha hızlı olmasını sağlamalıdır. Basit bir toplu iş dosyası, sunucu tarafında açılır. Kullanılabilirse, SMS işlevi

5

BITS (Arka Plan Akıllı Aktarım Hizmeti) kullanmayı deneyin. Windows Update'in kullandığı, Win32 API'sı aracılığıyla erişilebilen altyapıdır ve bu sorunu çözmek için özel olarak hazırlanmıştır.

Genellikle uygulama güncellemeleri için kullanılır, ancak herhangi bir dosya taşıma durumunda iyi çalışmalıdır.

http://www.codeproject.com/KB/IP/bitsman.aspx

0

Nasıl basitçe dosya göndermek sonra veya önce bir karma göndermeyi ve dosya ile alınan bu karşılaştırma hakkında? En azından doğru bir dosyanız olduğundan emin olmalısınız.

Tüm dışarı çıkmak isterseniz, aynı işlemi yapabilirsiniz, ancak dosyanın küçük bölümleri için. Daha sonra tüm parçalarınız olduğunda, bunları alıcı tarafa ekleyin.

+0

Bu tam olarak BITS'nin yaptığı şeydir. – TheSmurf

13

Bunun için mükemmel sonuçlar ile Robocopy kullandım. Varsayılan olarak, dosya karşıya geçene kadar her 30 saniyede bir tekrar dener.

+0

RoboCopy ve CopyFileEx önerileri için teşekkürler. Özellikle CopyFileEx ümit verici görünüyor. Şu anda, istemci uygulama gerçek dosya kopyasını yapmak için [SHFileOperation] (http://msdn.microsoft.com/en-us/library/bb762164 (VS.85) .aspx) kullanıyor. –

1

Robocopy ile bir çözüm olarak katılıyorum ...o yüzen yarar "Sağlam Dosya Kopyala"

denir ben mükemmel sonuçlar ile bunun için Robocopy'nin kullandım. Varsayılan olarak, dosya karşıya geçene kadar her 30 saniyede bir tekrar dener.

Ve varsayılan olarak, bir milyonu yeniden deneme. Bu aralıklı bağlantınız için bol olmalı.

Aynı zamanda yeniden başlatılabilir aktarımlar yapar ve hatta diğer programlar aynı bağlantıyı (/ IPG anahtarı) kullanıyormuş gibi tüm bant genişliğini kullanmak istemediğinizi varsayarak paketler arasında bir boşlukla gaz transferleri bile yapabilirsiniz?

0

Hm, rsync öyle görünüyor ve öyle düşündüm yüklemek/sunucu/cini gerekmez - sadece $ rsync src dst.

İlgili konular