2016-03-28 14 views
0

Bir ftp sunucuya bir dizinden bir dosyayı okumak sayede ben bir sorun yaşıyorum sonra boyutunu almak ve veri önce çağrı veri döner kopyalamak olamaz Yazılıyorum, arama kodumun dosyaya boş olduğunu düşünmesine neden oluyor, gerçekte ise, veriler doğru verilerle yazılıyor. Bu tuhaf. Sahnenin ardında kopyanın gerçekleştiği gibi, ama kodumun durum üzerinde herhangi bir kontrolü yok. Kaynak dosyayı silmeden önce verilerin yazıldığından kesinlikle emin olmalıyım (aksi halde önemli verileri kaybedebiliriz).(a Akış kaynağı kullanarak) bir dosyayı kopyalamak ve güvenilir operasyon

İşte benim kodum söz konusu. Not: ftp sunucusuna bağlanmak için System.Net.FtpClient kullanıyorum. OpenWrite yöntemi bir Stream nesnesini döndürür. Ayrıca, bu işlevde gördüğünüz Aktarım bağımsız değişkeni yalnızca yapılandırma verisi olan bir nesnedir (bağlanılacak kaynak/hedef dizin/sunucu, kimlik bilgileri, taşınacak dosya türleri vb.). Bu nesneyi göstermek gereksiz olacaktır. Sorun bu kodu vardır:

yanlış yapıyorum
public static void MoveFromDirectoryToFTP(Transport transport) 
    { 

     using (FtpClient destinationServer = new FtpClient()) 
     { 
      destinationServer.Host = transport.Destination.Host; 
      destinationServer.Credentials = new NetworkCredential(transport.Destination.UserName, transport.Destination.Password); 
      destinationServer.Connect(); 

      foreach (var file in Directory.EnumerateFiles(transport.Host, transport.FilePattern)) 
      { 
       try 
       { 
        if (!File.Exists(file)) 
        { 
         continue; 
        } 

        using (FileStream sourceStream = File.Open(file, FileMode.Open, FileAccess.ReadWrite, FileShare.None)) 
        { 
         if (sourceStream.Length == 0) continue; 

         using (Stream destinationStream = destinationServer.OpenWrite(Path.GetFileName(file), FtpDataType.Binary)) 
         { 
          sourceStream.CopyTo(destinationStream, (int)sourceStream.Length); 
         } 
        } 
        //this is returning zero, but a minute later i look at the server and the data is there 
        Debug.WriteLine("size after copy: " + destinationServer.GetFileSize(Path.GetFileName(file))); 

        if (destinationServer.GetFileSize(Path.GetFileName(file)) > 0) 
        { 
         File.Delete(file); 
        } 
       } 
       catch (Exception e) 
       { 
        Helper.LogErrorToDisk(e.Message + " when processing file " + file, e.Source, e.StackTrace); 
       } 
      } 
     } 
    } 

, ve neye tersi dizinleri ve ftp sunucular ve arasında güvenilir bir dosya kopyalama elde etmek yapabilirsiniz.

** DÜZENLEME: Henüz fark ettim ki bu GetFileSize yöntemi benim yöntemimde -1 döndürüyor. Neden bir ipucum var, belki de boyut almaya çalıştığında ftp sunucusundan biraz garip yanıt alıyor ('SIZE' komutunu gönderdiğinden eminim). Sunucu yapılandırması olabilir mi acaba? Bir dosya boyutunun geri alınmasına izin vermemek için ftp sunucularını yapılandırabilir misiniz? **

cevap

0

Hedef dosya boyutunun kaynak dosya boyutuna eşit olduğunu kontrol edin ve silin. sahte kod

..

while destination file size not equal to source file size 
    sleep (1000ms) 
end while 

delete destination file 
İlgili konular