2016-04-15 96 views
2

現在、SFTPを使用してUnixサーバーにファイルをアップロードするためにRenci SSH.NETライブラリを使用しています。私が気に入らないことの1つは、ファイルをアップロードした後、作成日と変更日時がアップロードが行われた時点に変更されることです。SSH.NET:SFTPを使用してファイルをアップロードし、ソースファイルからファイルの日付を保存できますか?

ソースファイルから元のファイルの日付を保存したいのですが可能ですか?

答えて

4

SSH.NETライブラリは自動的にあなたのためにそれをしません。それをコード化する必要があります。

SftpClient.SetLastWriteTimeSftpClient.SetLastWriteTimeUtcの方法があります。しかし、実際にはまだ実装されていません。

あなたが代わりにこのようにそれをコーディングすることができます。クライアントとサーバーがでない場合は原因SftpFileAttributesでUTCのAPIの不足のために、あなたは、正確にタイムスタンプを設定する問題を抱えているかもしれないが

SftpFileAttributes fileAttributes = client.GetAttributes(targetFile); 
fileAttributes.LastWriteTime = File.GetLastWriteTime(sourceFile); 
client.SetAttributes(targetFile, fileAttributes); 

同じタイムゾーン。


タイムスタンプを自動的に、理想的にはUTCで保存できる別のSFTPライブラリを使用してください。

たとえば、WinSCP .NET assemblyは自動的に行います。ただ、Session.PutFiles methodを使用します。

session.PutFiles(sourceFile, targetFile).Check(); 

(私はWinSCPのの著者です)

+1

は、私の答えは役に立ちましたか? –

+0

はい、あなたの答えは多大な助けになりましたが、間違ったスレッド、私の考え方に誤ってコメントしました。私が気づいたことは、このコードがかなり遅いことです。アップロードした数千個の小さなファイルのファイルサイズをそれぞれKB単位で保存し、数秒かかるコピープロセスと比較して、私のシステムでは、各ファイルは非常に長く、数千分かかることがあります。それを一般的に速くする方法はありますか? – Erik

+0

1)どのようなコードですか? SSH.NETまたはWinSCP? 2)とにかく、何が遅くなるのか分からない。あなたは、私たちに最適化を依頼する前に見つけなければなりません。一般的には、処理の並列化をお勧めします。 SFTPプロトコルはそれを可能にします。タイムスタンプを設定する複数の要求をキューに入れます。 SSH.NETでは 'SftpSession.RequestLStat'の実装方法を見てください。 'WaitOnHandle'を削除し、並列処理のために適切に置き換えてください。 –

関連する問題