2012-06-01 13 views
6

Użycie zestawu .NET programu WinSCP do przesłania pliku. OperationResultBase.Check() rzuca się następujący błąd:WinSCP: Jak upewnić się, że przesyłanie SFTP zostanie zmienione z .zip.filepart na .zip?

WinSCP.SessionRemoteException: Transfer was successfully finished, but temporary transfer file 'testfile.zip.filepart' could not be renamed to target file name 'testfile.zip'. If the problem persists, you may want to turn off transfer resume support.

Wydaje się, że to się dzieje w przypadku każdego pliku zip, który próbuję wysłać. Jeśli robi różnicę, są to pliki zip, które zostały utworzone przy użyciu biblioteki DotNetZip.

Kod, który używam, podjęte prawie bezpośrednio z przykładu w dokumentacji WinSCP:

public void uploadFile(string filePath, string remotePath) 
{ 
    TransferOptions transferOptions = new TransferOptions(); 
    transferOptions.TransferMode = TransferMode.Binary; 
    TransferOperationResult transferResult; 
    transferResult = currentSession.PutFiles(filePath, remotePath, false, transferOptions); 
    transferResult.Check(); 
    foreach (TransferEventArgs transfer in transferResult.Transfers) 
    { 
     Console.WriteLine("Upload of {0} succeeded", transfer.FileName); 
    } 
} 

Discussion over at the WinSCP forum wskazuje, że zespół nie pozwalają jeszcze programową kontrolę wsparcia transferu wznowienia. Czy istnieje obejście tego problemu?

+1

wydaje dziwne mi się, że przesyłanie używa innego pliku niż faktycznie żądanego pliku. Czy masz nad tym kontrolę? – sarnold

+0

@sarnold, z dokumentacji WinSCP: "Podczas przesyłania pliku z protokołem SFTP, jest on najpierw przesyłany do pliku tymczasowego z rozszerzeniem .filepart, dopiero po zakończeniu transferu rozszerzenie jest usuwane." – sigil

+0

Jeśli masz dostęp do serwera, możliwe jest uruchomienie czegoś takiego jak monitor procesu z SysInternals, aby zobaczyć, co się stanie, gdy zakończy się przesyłanie pliku. Na przykład program antywirusowy może rozpocząć skanowanie pliku w momencie zamknięcia pliku i nadal mieć dostęp do pliku po próbie zmiany nazwy. – sgmoore

Odpowiedz

4

Brzmi to tak, jakby system plików na serwerze docelowym, do którego jest przesyłany plik, nie zezwala na zmiany w plikach. Może to spowodować, że zmiana nazwy pliku na zakończenie przesyłania zakończy się niepowodzeniem, mimo że cały plik został załadowany i zapisany w systemie plików z nazwą pliku tymczasowego używanego podczas przesyłania. Jeśli nie masz dostępu administracyjnego do serwera docelowego, możesz to sprawdzić, próbując zmienić nazwę pliku, który znajduje się już na serwerze docelowym. Jeśli to również się nie powiedzie, będziesz musiał zmienić odpowiednie uprawnienia serwera docelowego, aby to działało. W przeciwnym razie możesz potrzebować skorzystać z porady zawartej w komunikacie o błędzie, aby wyłączyć obsługę wznowienia, więc jest ona początkowo otwarta do zapisu z żądaną nazwą pliku zamiast tymczasowej nazwy pliku (z rozszerzeniem .filepart).

+0

@sarnold - Masz rację, ciągle odwoływałem się do FTP w mojej odpowiedzi zamiast SCP. Pobierałem niektóre pliki dziennika przez FTP podczas pisania, a więc błąd w nazewnictwie. Naprawione, ponieważ odpowiedź jest inaczej zgodnie z przeznaczeniem. – dmarietta

+0

Mogę ręcznie zmienić nazwę pliku przy użyciu sesji GUI programu WinSCP. Jak zauważyłem na końcu mojego pytania, zestaw .NET nie ma funkcji do kontrolowania obsługi wznowienia transferu. WinSCP jest open source, więc mogę napisać opakowanie C# dla funkcji, którą chcę, ale miałem nadzieję na szybsze rozwiązanie. – sigil

+0

Kolejna szybka uwaga na ten temat: Mam uprawnienia do zmiany nazw plików na serwerze docelowym. Ponadto proces przesyłania działa dobrze, gdy robię to za pomocą GUI; to tylko wtedy, gdy próbuję zrobić to przez .NET, który zawodzi. – sigil

0

Pomoże to, jeśli włączysz pełny komunikat o błędzie, łącznie z główną przyczyną zwróconą przez serwer.

Domyślam się, że istnieje aplikacja antywirusowa (lub podobna) działająca po stronie serwera. Aplikacja antywirusowa sprawdza dowolny plik po zakończeniu przesyłania. Jest to sprzeczne z próbą zmiany nazwy pliku przez program WinSCP po zakończeniu przesyłania. Problem może częściej występować w archiwach .ZIP, ponieważ są one zwykle większe lub po prostu dlatego, że muszą zostać wyodrębnione przed sprawdzeniem (co zajmuje trochę czasu).

W każdym razie możesz wyłączyć przesyłanie do nazwy pliku tymczasowego za pomocą TransferOptions.ResumeSupport.

Zobacz także dokumentację dla error message "Transfer was successfully finished, but temporary transfer file ... could not be renamed to target file name ..."

1

Wyłącz resumesupport:

put *.txt -nopreservetime -nopermissions -resumesupport=off 
Powiązane problemy