2016-10-18 8 views
3

同じリモートマシンの大きなファイルをコピーする効率的なソリューションに取り組んでいます。それはFILESERVERと呼ばせてください。その後、別のサーバー(WEBSERVER)からこれらのファイルのコピーをリモートで発行したいので、Windowsエクスプローラで同じリモート共有フォルダにファイルをコピー/ペーストしようとしましたが、ファイル内容を移動する必要はありません私は共有フォルダを使用し、単にWEBSERVERからファイルをコピーすると思った。同じリモートマシンのUNCパスを効率的にコピーする方法

私は次のコードで試してみました。

File.Copy("\\FILESERVER\FOLDER\bigfile", "\\FILESERVER\FOLDER2\bigfile"); 

これは動作しますが、私はそれが実際にネットワーク経由でファイルの内容を移動していることに気づいた、それは私が避けたかったまさにです。私は組み込みのWindowsのメカニズムでファイルをコピーできるようにするには、FILESERVERにサーバーを実装してファイルをコピーするコマンドを受け取る必要はありません。したがって、私が実装したい動作は、同じエクスプローラで、C#コードから呼び出すことです。だから、.NETでこれを行うことは可能ですか?

編集: 私はXCOPYコマンドを試してみましたが、最初はネットワークを使用していないようでした。 しかし、OSのキャッシングが行われていないことを確認するためにリブートした後、cmdからXCOPYを実行するとProcess Explorer/taskmgrのI/Oは表示されませんが、C#それはコードです。だから私はそれがファイルの内容を取得/書き込みにネットワークを使用すると思うが、奇妙な理由では、これらの診断ツール(taskmgr /プロセスエクスプローラ)で報告されていません。

+0

古くなったシェルオブジェクトでも可能です - https://msdn.microsoft.com/en-us/library/windows/desktop/bb787866(v=vs.85).aspxを参照してください(isn C#の例はありませんが、それはあなたを始められるかもしれません)。標準のWindows Explorerのコピーダイアログを表示しないフラグがあるので、Windowsエクスプローラで使用されているAPIと同じである必要があります。 –

+1

コマンドラインからのCOPYコマンドで動作するか試してみてください。もしそうなら、それを 'proc = ProcessStartInfo(" cmd "、"/c COPY \\ FILESERVER \ FOLDER \ bigfile \\ FILESERVER \ FOLDER2 \ bigfile ")で実行してください。 ... proc.Start(); ' – Codo

+0

XCOPYにもう一度試してみる必要がありますが、ネットワーク経由でコンテンツを移動することに気付きました。私はそれが働いたとのコメントをしましたが、もう一度試してください。 – jorgonor

答えて

1

PSEXECを使用し、リモートマシンのローカルフォルダパスでコピーを実行します。

+0

PSEXECは自立しており、自動的に他のマシンにサービスをインストールします。しかし、私はむしろ外部のユーティリティなしでコードからそれを行うだろう。私は誰かが存在する場合、それを行うためのAPIを知っていれば幸いです。 – jorgonor

+0

ローカルで実行するとローカルのみになります。コマンドはデータを「管理」する必要があるため、別のマシンからは常にネットワークが使用されます。 – Dexion

+0

私は最初は同じことを考えましたが、私は同じ共有フォルダにファイルをコピーしてしまい、taskmgrはネットワーク活動がほとんどありません。それは、Windowsがコピーをリモートハードドライブで実行できることを知らせる何らかの「API」を使用しているようなものです。 – jorgonor

1

間違いなくWMIを使用するとよいでしょう。私は最終的に次のコードとCopyExメソッドを使ってディレクトリを再帰的にコピーすることに成功しました。

var classInstance = new ManagementObject("\\\\FILESERVER\\root\\cimv2", "Win32_Directory.Name='c:\\path\\to\\directory1'", null); 

var copyExInParams = classInstance.GetMethodParameters("CopyEx"); 

// Add the input parameters. 
copyExInParams["FileName"] = "c:\\path\\to\\directory2"; 
copyExInParams["Recursive"] = true; 
copyExInParams["StartFileName"] = null; 

var copyExOutParams = classInstance.InvokeMethod("CopyEx", copyExInParams, null); 

パスはリモートマシン形式である必要があります。私はそれを証明することはできませんが、おそらくWindowsエクスプローラはWMIを利用して、同じリモートマシン上のファイルを共有フォルダにコピーして無駄なネットワークトラフィックを防止しています。私はUNCと直接やり取りする方法を見つけていません。これは私のユースケースに合っています。

関連する問題